大家好,我被困在这里需要帮助:
每个项目都有一个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
!
答案 0 :(得分:8)
这是因为当您用户RecycleView
时,每次滚动时都会重复使用您的视图。 RecycleView
重用您的资源
因此,当您滚动它时,您的视图显示错误状态
如果您为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);