2016-06-09 6 views
0

Как вы можете видеть в видео, ListView не прокручивается плавно.ListView с загрузчиком изображений не загружается эффективно

https://youtu.be/pNnyNDTc9Cg

Это как всегда перезагружать изображение из URL.

Что я хочу иметь, это должно выглядеть гладко, так профессионально.

Если изображение недействительно, изображение должно быть невидимым и нулевым.

Я использую библиотеку Universal-Image-Loader.

Вот мой код.

String url = MainActivity.IMAGE_URL + "postid=" + model.get(position).getId(); 
loader.loadImage(url, new SimpleImageLoadingListener() { 
    @Override 
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
     holder.image.setVisibility(View.VISIBLE); 
     holder.image.setImageBitmap(loadedImage); 
    } 

    @Override 
    public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
     holder.image.setVisibility(View.GONE); 
     holder.image.setImageBitmap(null); 
    } 

    @Override 
    public void onLoadingCancelled(String imageUri, View view) { 
     holder.image.setVisibility(View.GONE); 
     holder.image.setImageBitmap(null); 
    } 
}); 

И вот полный код.

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View view; 
    if(convertView == null) { 
     LayoutInflater inflater = LayoutInflater.from(context); 
     view = inflater.inflate(R.layout.post_adapter, null); 

     ViewHolder viewHolder = new ViewHolder(); 

     viewHolder.avatar = (ImageView) view.findViewById(R.id.post_avatar); 
     viewHolder.title = (TextView) view.findViewById(R.id.post_title); 
     viewHolder.time = (TextView) view.findViewById(R.id.post_time); 
     viewHolder.text = (TextView) view.findViewById(R.id.post_text); 
     viewHolder.image = (ImageView) view.findViewById(R.id.post_image); 
     viewHolder.likes = (TextView) view.findViewById(R.id.post_likes); 
     viewHolder.comments = (TextView) view.findViewById(R.id.post_comments); 
     viewHolder.likeImage = (ImageView) view.findViewById(R.id.like_image); 
     viewHolder.likeText = (TextView) view.findViewById(R.id.like_text); 
     viewHolder.shareBtn = view.findViewById(R.id.share_btn); 
     viewHolder.commentBtn = view.findViewById(R.id.comment_btn); 
     viewHolder.likeBtn = view.findViewById(R.id.like_btn); 

     view.setTag(viewHolder); 
    } else { 
     view = convertView; 
    } 
    final ViewHolder holder = (ViewHolder) view.getTag(); 

    final boolean hasLiked = model.get(position).isHasLiked(); 

    if(hasLiked) { 
     holder.likeImage.setImageResource(R.drawable.ic_action_like_clicked); 
     holder.likeText.setText(context.getString(R.string.dislike)); 
     holder.likeText.setTextColor(context.getResources().getColor(R.color.color_clicked)); 
    } else { 
     ColorStateList textColor = holder.title.getTextColors(); 
     holder.likeImage.setImageResource(R.drawable.ic_action_like); 
     holder.likeText.setText(context.getString(R.string.like)); 
     holder.likeText.setTextColor(textColor); 
    } 

    holder.title.setText(model.get(position).getTitle()); 

    ImageLoader loader = ImageLoader.getInstance(); 
    DisplayImageOptions options = new DisplayImageOptions.Builder() 
      .showImageForEmptyUri(R.drawable.avatar) 
      .showImageOnFail(R.drawable.avatar).build(); 

    loader.displayImage(model.get(position).getAvatar(), holder.avatar, options); 

    String time = MainActivity.getTimeAgo(new Date(model.get(position).getTime() * 1000), context); 
    holder.time.setText(time); 

    if(model.get(position).getText().isEmpty()) { 
     holder.text.setVisibility(View.GONE); 
    } else { 
     holder.text.setVisibility(View.VISIBLE); 
     holder.text.setText(model.get(position).getText()); 
    } 

    // HERE 
    String url = MainActivity.IMAGE_URL + "postid=" + model.get(position).getId(); 
    loader.loadImage(url, new SimpleImageLoadingListener() { 
     @Override 
     public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
      holder.image.setVisibility(View.VISIBLE); 
      holder.image.setImageBitmap(loadedImage); 
     } 

     @Override 
     public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
      holder.image.setVisibility(View.GONE); 
      holder.image.setImageBitmap(null); 
     } 

     @Override 
     public void onLoadingCancelled(String imageUri, View view) { 
      holder.image.setVisibility(View.GONE); 
      holder.image.setImageBitmap(null); 
     } 
    }); 

    holder.likes.setText(String.valueOf(model.get(position).getLikes())); 
    String comments = model.get(position).getComments() + " " + context.getString(R.string.comments); 
    holder.comments.setText(comments); 
    return view; 
} 

ответ

0

Я использую этот код после попытки использования Universal ImageLoader, библиотеки Picasso и Glide, и это самый быстрый для меня с помощью RecyclerView.

Uri uri = Uri.fromFile(new File(path)); 

Picasso.with(mContext) 
.load(URL_OF_IMAGE) 
.error(R.drawable.blank) 
.config(Bitmap.Config.RGB_565) 
.resizeDimen(R.dimen.d50dp, R.dimen.d50dp) 
.centerCrop() 
.into(holder.imageview); 

Проверить это owesome звено, которое показывает разницу в отношении загрузки времени и памяти в деталях, https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en

+0

.config (Bitmap.Config.RGB_565) будет использовать очень меньше памяти и .resizeDimen (R.dimen .d50dp, R.dimen.d50dp) загрузит небольшое изображение из памяти, поэтому потребуется меньше времени и памяти. –

+0

Я изменился на Picasso, но как я могу починить эту ошибку, когда прокручиваю вниз, а затем снова загружает изображение. Как в видео, которое я записал. https://youtu.be/sV57QFAc7FU (новое видео) – enucar

+1

Nevermind исправлено. После того, как я перешел на Picasso, мое приложение этого не заметило. Я очистил свое приложение в задаче и очистил, перестроил проект. Теперь это работает. спасибо – enucar

0

Вы можете расширить свой DisplayImageOptions с помощью дополнительных возможностей кеширования.

DisplayImageOptions options = new DisplayImageOptions.Builder() 
     .showImageForEmptyUri(R.drawable.avatar) 
     .showImageOnFail(R.drawable.avatar) 
     .cacheInMemory(true) // default is false 
     .cacheOnDisk(true) // default is false 
     .build(); 

Источник: DisplayImageOptions

Вы также можете изменить по умолчанию ImageLoaderConfiguration и кэш изменение размера или увеличить приоритет потока (если хотите). Обратите внимание, что вам нужно установить эту конфигурацию только один раз в вашем приложении, в отличие от DisplayImageOptions. См.: ImageLoaderConfiguration