recyclerview中的项目更改错误

时间:2017-07-11 08:48:56

标签: android android-recyclerview

大家好,我被困在这里需要帮助:

每个项目都有一个CheckBox,我为setOnLongClickListener中的项目的根元素设置RecyclerView,如下所示:

    holder.faviorateVideoItemRelative.setOnLongClickListener(new View.OnLongClickListener() {
        public boolean onLongClick(View arg0) {


            if (chk_visible)
            {
                return  true ;
            }
            holder.chk_faviorateVideo.setChecked(!holder.chk_faviorateVideo.isChecked());
            chk_visible = true ;
            checkedItemsCNT = 1 ;
            deleteListVideoCourses.add(data.get(holder.getAdapterPosition())) ;
            notifyDataSetChanged() ;
            return  true ;
        }
    });

如果我向下滚动,当我长按其中一个项目时,会检查错误项目的CheckBox

5 个答案:

答案 0 :(得分:8)

这是因为当您用户RecycleView时,每次滚动时都会重复使用您的视图。 RecycleView重用您的资源 enter image description here

因此,当您滚动它时,您的视图显示错误状态

解决方案

如果您为onBindViewHolder签入任何逻辑,那么您必须同时使用这两部分的真假

if(yourCondition){
   //code if condition is true
}else {
   //code if condition is false
}

其他解决方案

只需使用一个语句即可解决问题,以阻止RecycleView重复使用您的视图状态

@Override
public void onBindViewHolder(ReqNotificationAdapter.MyViewHolder holder, int position) {

    holder.setIsRecyclable(false);
    //.................your other code
}

我用它来解决我的问题..希望如果你没有问题就能解决你的问题停止回收你的目的。

答案 1 :(得分:1)

可能是绑定中的问题,而不是设置值。

常见的错误不是取消检查绑定中的视图。

确保选中设置的位置,您有一个else语句并将其设置为未选中。

RecyclerView和Listview在滚动时重复使用视图,其中包括以前选中的任何框。因此,在适当的情况下取消检查它们非常重要。

public void bindView(View view,   ..... //varies on implementation. rough idea.
{
  CheckBox mycheckbox = (CheckBox)view.findViewById(R.id.myidofcheckbox);


  int pos = view.getPosition();

  if(pos == 1) //example
     mycheckbox.setChecked(true);
  else
     mycheckbox.setChecked(false);

答案 2 :(得分:0)

是的,它发生在ListView和RecyclerView

试试这段代码,

 holder.faviorateVideoItemRelative.setTag(position);
 holder.faviorateVideoItemRelative.setOnLongClickListener(new View.OnLongClickListener() {
    public boolean onLongClick(View arg0) {

        int tempPos = (int)holder.faviorateVideoItemRelative.getTag();

        if (chk_visible)
        {
            return  true ;
        }

         if(!holder.chk_faviorateVideo.isChecked())
         {
             holder.chk_faviorateVideo.setChecked(true);
         }
         else
         {
             holder.chk_faviorateVideo.setChecked(false);
         }

    holder.chk_faviorateVideo.setChecked(!holder.chk_faviorateVideo.isChecked());
        chk_visible = true ;
        checkedItemsCNT = 1 ;
        deleteListVideoCourses.add(data.get(tempPos)) ;
        notifyDataSetChanged() ;
        return  true ;
    }
});

希望它会对你有所帮助。

答案 3 :(得分:0)

初始化OnLongClickListener时,当它们被缓存时,它们在不再可见时会在视图中重复使用。 要解决这个问题,请创建一个新类以将对象显式链接到侦听器而不仅仅是视图。 例如:

private class BufferVideoLongClickListener implements View.OnLongClickListener {

    private VideoObject video; // And other stuff like checked, etc

    BufferVideoLongClickListener(VideoObject video, ...) {
        this.video = video;
        ...
    }

    @Override
    public void onLongClick(View view) {
        // Do your check and other things
        if(checked)
          ...
    }
}

在你的onBindViewHolder:

holder.faviorateVideoItemRelative.setOnLongClickListener(new BufferVideoLongClickListener(video, ...));

答案 4 :(得分:0)

解决方案1:

您可以重写两个方法getItemId,getItemViewType。

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

赞:

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


    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }
}

解决方案2: 将setIsRecyclable设置为false。

EasyAdapter easyAdapter=new EasyAdapter();
easyAdapter.setIsRecyclable(false);