当我在Recyclerview中向上或向下滚动时,回收利用功能无法正常工作。

3

这是我的代码
当我上下滚动页面时,图片会在其他位置添加,即使在那些位置上的图片路径不存在。假设图片路径在1、2和3位置,但它也会在4、10、15等位置显示图片。

public class Contact_Adapter_RecyeckView extends
RecyclerView.Adapter<Contact_Adapter_RecyeckView.ViewHolder> {
private ArrayList<ContactBean> arraylist;
private Context context;

public Contact_Adapter_RecyeckView(Context context,
        ArrayList<ContactBean> arrayListImages) {
    this.arraylist = arrayListImages;
    this.context = context;
}

// Create new views (invoked by the layout manager)
@Override
public Contact_Adapter_RecyeckView.ViewHolder onCreateViewHolder(
        ViewGroup parent, int viewType) {
    // create a new view
    View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
            R.layout.contact_adapter_recycleview, null);

    // create ViewHolder

    ViewHolder viewHolder = new ViewHolder(itemLayoutView);
    return viewHolder;
}

// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder viewHolder, int pos) {

    String image = arraylist.get(pos).getImage();

         File imgFile = new  File(image);
            if(imgFile.exists())
            {

                viewHolder.ivProfile.setImageURI(Uri.fromFile(imgFile));

            }


        //viewHolder.ivProfile.setImageBitmap(BitmapFactory.decodeFile(arraylist.get(pos).getImage()));
        //viewHolder.ivProfile.setVisibility(View.VISIBLE); 

// inner class to hold a reference to each item of RecyclerView
public static class ViewHolder extends RecyclerView.ViewHolder {

    public ImageView ivProfile;
    public View view;
    public CardView cardview;

    public ViewHolder(View itemLayoutView) {
        super(itemLayoutView);

        ivProfile = (ImageView) itemLayoutView
                .findViewById(R.id.iv_user_profile);


    }
}

// Return the size of your itemsData (invoked by the layout manager)
@Override
public int getItemCount() {
    return arraylist.size();
}}    

我看到了这个链接,以及其他一些链接,但问题仍然存在在改变时滚动,找不到原因。


也许是因为 imgFile.exists() 返回了 false,尝试在 else 块中设置默认图像。 - Rami
如果没有图像路径,那么图像变量将包含空白。 - tarun
你需要在else块中重置默认图像(空白图像),否则回收机制会重新使用旧的图像。 - Rami
谢谢,它工作得很好。 :-) 你节省了我很多时间。 - tarun
我的StackOverflow声望只有1,为了接受答案我需要至少15分 :-( - tarun
您不需要15声望就能接受一个答案,您只需要点击答案旁边的勾选标志即可。(15声望是为了获得点赞特权) - Rami
3个回答

4

您需要在else块中重置默认图像,否则回收机制将重新使用旧图像。

@Override
public void onBindViewHolder(ViewHolder viewHolder, int pos) {

    String image = arraylist.get(pos).getImage();
    File imgFile = new  File(image);
       if(imgFile.exists()){
          viewHolder.ivProfile.setImageURI(Uri.fromFile(imgFile));
       } else {
         // here you set your default image, or you can just hide "viewHolder.ivProfile"
       }
}

0

onBindViewHolder()中收到的视图是被回收过的,因此ImageView可能携带着之前初始化的数据,所以如果当前项没有数据,您需要明确地隐藏/清除ImageView:

@Override
public void onBindViewHolder(ViewHolder viewHolder, int pos) {
    String image = arraylist.get(pos).getImage();
    File imgFile = new  File(image);
    if(imgFile.exists()) {
        viewHolder.ivProfile.setImageURI(Uri.fromFile(imgFile));
    } else {
        viewHolder.ivProfile.setVisibility(View.INVISIBLE);
    }
}

当我设置为不可见时,它运行良好,但是如果不包含路径,我希望它显示已经设置的默认图像。 - tarun
非常感谢,它表现良好。 :-) 你节省了我很多时间。我设置了默认图像而不是隐藏,else块对我起作用了。 - tarun
很高兴能帮到你!如果这个答案对你有用,请接受它。 - Egor

0

首先 当你在onBindViewHolder中写条件时,你必须也要在条件中写出你的操作。 比如

if(condition){
    //Write your code for condition is true
}else{
    //Write your code if condition is false
}

你可能只是这样做并没有得到正确的结果...
因为在onBindViewHolder中第一次显示视图时,会对资源进行分配;而第二次则使用缓存...
在我的情况下也发生了这种情况。
要解决这个问题,请编写以下代码...

@Override
public void onBindViewHolder(ViewHolder viewHolder, int pos) {
 //To stop recycle 
 holder.setIsRecyclable(false);

 //your code
 ...........

 //your conditional work
 if(condition){
    //Write your code for condition is true
 }else{
    //Write your code if condition is false
 }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接