2017-09-14 55 views
2

我决定使用RecyclerView来显示我的数据列表。每个项目/行中都有一个复选框,2个TextViews和一个ImageView。我创建了适配器来处理所有事情,并将检查的项目添加到我的最终列表中。RecyclerView检查错误的项目,当我向下滚动

问题是,当我检查一些项目并向下滚动时,某些项目会显示为已选中状态,并且当我向上滚动时,我以前检查过的项目显示为未选中状态。图像和文字浏览是可以的,但是当向下滚动时,复选框会出现混乱。

这是我的适配器:

public class TeamAdapter extends RecyclerView.Adapter<TeamAdapter.MyViewHolder> { 

    private Context mContext; 
    private List<UserProject> UserList; 
    private UserProject user; 


    public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     public TextView name, description; 
     public CircleImageView profile_image; 
     public CheckBox check; 

     public MyViewHolder(View view) { 
      super(view); 
      name = (TextView) view.findViewById(R.id.name); 
      description = (TextView) view.findViewById(R.id.description); 
      profile_image = (CircleImageView) view.findViewById(R.id.profile_image); 
      check = (CheckBox) view.findViewById(R.id.check); 
     } 
     @Override 
     public void onClick(View v) { 
      if (mItemClickListener != null) { 
       mItemClickListener.onItemClickListener(v, getAdapterPosition()); 
      } 
     } 
    } 


    public TeamAdapter(Context mContext, List<UserProject> userList) { 
     this.mContext = mContext; 
     this.UserList = userList; 

    } 
    @Override 
    public TeamAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View itemView = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.adapter_teams, parent, false); 

     return new MyViewHolder(itemView); 
    } 

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

     user = UserList.get(position); 

     holder.name.setText(user.getName()); 
     holder.description.setText(user.getCompany()); 

     if(user.getImageURL() != null && !user.getImageURL().isEmpty()) { 
      Picasso.with(mContext).load(user.getImageURL()).into(holder.profile_image); 
     } 

     holder.check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if(isChecked){ 
        ActivityTeams.newList.add(UserList.get(position)); 
       }else { 
        ActivityTeams.newList.remove(UserList.get(position)); 
       } 
      } 
     }); 

    } 


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

    private TeamAdapter.onRecyclerViewItemClickListener mItemClickListener; 

    public void setOnItemClickListener(TeamAdapter.onRecyclerViewItemClickListener mItemClickListener) { 
     this.mItemClickListener = mItemClickListener; 
    } 

    public interface onRecyclerViewItemClickListener { 
     void onItemClickListener(View view, int position); 
    } 
} 
+2

[RecyclerView中的CheckBox继续检查不同的项目]的可能重复(https://stackoverflow.com/questions/32427889/checkbox-in-recyclerview-keeps-on-checking-different-items) – TofferJ

+0

它没有为我使用这个问题的解决方案。 –

回答

1

如同在重复回答的评论,你的持有人保留复选框视图。您只需根据您的支持数据更新复选框状态。

onBindViewHolder分配检查监听器之前补充一点:

holder.check.setOnCheckedChangeListener(null);  
holder.check.setChecked(ActivityTeams.newList.contains(UserList.get(position)); 
holder.check.setOnCheckedChangeListener(new ... "you know what to do here" 

基于从这里https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/CompoundButton.javasetChecked CompoundButton源代码:

/** 
* <p>Changes the checked state of this button.</p> 
* 
* @param checked true to check the button, false to uncheck it 
*/ 
@Override 
public void setChecked(boolean checked) { 
    if (mChecked != checked) { 
     mCheckedFromResource = false; 
     mChecked = checked; 
     refreshDrawableState(); 
     notifyViewAccessibilityStateChangedIfNeeded(
       AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED); 

     // Avoid infinite recursions if setChecked() is called from a listener 
     if (mBroadcasting) { 
      return; 
     } 

     mBroadcasting = true; 
     if (mOnCheckedChangeListener != null) { 
      mOnCheckedChangeListener.onCheckedChanged(this, mChecked); 
     } 
     if (mOnCheckedChangeWidgetListener != null) { 
      mOnCheckedChangeWidgetListener.onCheckedChanged(this, mChecked); 
     } 
     final AutofillManager afm = mContext.getSystemService(AutofillManager.class); 
     if (afm != null) { 
      afm.notifyValueChanged(this); 
     } 

     mBroadcasting = false; 
    } 
} 

,你可以看到调用setChecked也称目前连接监听器。

+0

感谢您的回复。我将这一行添加到适配器,现在它不再随机检查,但当我向下滚动并备份时,它会不断地将项目添加到我的列表中。 –

+0

我的意思是,反复添加。 –

+0

我希望你在编辑之前忽略了我的评论。要优化听众的设置需要更多的工作,请忽略该部分。你没有执行这个对不对?因为它被打破了错误的代码。 –

1

您没有指定CheckBox是否在您的onBindViewHolder()方法中被选中。因此,当视图被创建/回收时,RecyclerView无法知道CheckBox是否被选中。

您可以尝试保存单独ArrayList中每个对应CheckBox的checked/unchecked状态,或者与您的UserProject类合并并将信息保存在那里。

之后,您可以简单地说holder.check.setChecked(...);其中...是CheckBox的条件。

相关问题