2016-04-24 2 views
1

У меня есть RecyclerView для отображения данных списка, но после прокрутки вверх и вниз загрузка изображения с url с помощью Volley исчезает и появляется снова. Я знаю, что список будет перерабатывать элемент после прочтения этого How ListView's recycling mechanism works. Вот мой Адаптер, где я ошибся?Изображение Android исчезает в RecyclerView после прокрутки списка вверх и вниз?

public class PostAdapter extends RecyclerView.Adapter<PostAdapter.ViewHolder> { 

private ArrayList<Post> posts; 
private Context context; 
private ImageLoader imageLoader; 

public PostAdapter(ArrayList<Post> posts, Context context) { 
    this.posts = posts; 
    this.context = context; 
    imageLoader = MySingleton.getInstance(context).getImageLoader(); 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.item_post, parent, false); 
    return new ViewHolder(view); 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
    holder.name.setText(posts.get(position).getName()); 
    holder.timestamp.setText(posts.get(position).getTimestamp()); 
    holder.status.setText(posts.get(position).getStatus()); 
    holder.avatar.setImageUrl(Constants.URL_IMAGE + posts.get(position).getAvatar(), imageLoader); 
    if(!posts.get(position).getImage().equals("")) { 
     holder.image.setVisibility(View.VISIBLE); 
     holder.image.setImageUrl(Constants.URL_IMAGE + posts.get(position).getImage(), imageLoader); 
    } else { 
     holder.image.setVisibility(View.GONE); 
    } 
} 

@Override 
public int getItemCount() { 
    return posts.size(); 
} 

public static class ViewHolder extends RecyclerView.ViewHolder { 
    NetworkImageView image, avatar; 
    TextView status, timestamp, name; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     avatar = (NetworkImageView) itemView.findViewById(R.id.profilePic); 
     image = (NetworkImageView) itemView.findViewById(R.id.feedImage1); 
     status = (TextView) itemView.findViewById(R.id.txtStatusMsg); 
     name = (TextView) itemView.findViewById(R.id.name); 
     timestamp = (TextView) itemView.findViewById(R.id.timestamp); 
    } 
}} 
+1

эй @tuanpit, сталкиваясь же вопрос, вы нашли исправления для этого? если да, то можете поделиться им. –

+0

@BipinVayalu В моем случае, beacuse Я использую свой компьютер в качестве сервера для мобильных приложений, возможно, соединение медленное, или какой-то другой proplem сделал эту проблему. Когда я помещаю свое приложение в настоящий сервер, все работает нормально. Извините из-за позднего ответа, но надеюсь, что он поможет вам и другим людям – tuanptit

ответ

0

В вашей реализации вы звоните setImageUrl() каждый раз, когда вы связываете к держателю вида. Eventhough ImageLoader поддерживает и использует кэш, он находится на сетевом уровне, что дает вам небольшую задержку между настройкой URL-адреса и отображением изображения (исчезают и появляются).

Чтобы справиться с этим лучше, вы должны реализовать кэш-памяти для ваших изображений и установить их непосредственно как

String image = posts.get(position).getImage(); 
if("".equals(image)) { 
    holder.image.setVisibility(View.GONE); 
} else if (cache.hasImage(image)) { 
    holder.image.setVisibility(View.VISIBLE); 
    holder.image.setImageBitmap(cache.getImage(image)); 
} else { 
    holder.image.setVisibility(View.VISIBLE); 
    holder.image.setImageUrl(Constants.URL_IMAGE + image, imageLoader); 
} 

где cache бы свою собственную реализацию.

-1

нравится этот

holder.image.setVisibility(View.VISIBLE); 
if(!posts.get(position).getImage().equals("")) {   
     holder.image.setImageUrl(Constants.URL_IMAGE + posts.get(position).getImage(), imageLoader); 
    } else { 
     holder.image.setVisibility(View.GONE); 
    } 
Смежные вопросы