Android 在RecyclerView中的复选框选择中重复
下面是我的代码Android 在RecyclerView中的复选框选择中重复,android,checkbox,android-recyclerview,Android,Checkbox,Android Recyclerview,下面是我的代码 holder.followDiseaseCheckBox.setOnClickListener(new View.OnClickListener() { @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @Override public void onClick(View view) { if (holder.followDiseaseCheckBox.isC
holder.followDiseaseCheckBox.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onClick(View view) {
if (holder.followDiseaseCheckBox.isChecked()) {
holder.followDiseaseCheckBox.setChecked(true);
checkBoxClicked++;
holder.followDiseaseCheckBox.setChecked(true);
// for Follow.
if (isFollowOrUnFollow.equals("FOLLOW")) {
((FollowActivity) context).diseaseListFromAdapter.add(String.valueOf(diseaseMap.get("id")));
((FollowActivity) context).setFollowButton(true);
}
// for Unfollow.
else if (isFollowOrUnFollow.equals("UN_FOLLOW")) {
((FollowTwoActivity) context).unFollowedDiseaseListFromAdapter.add(String.valueOf(diseaseMap.get("id")));
((FollowTwoActivity) context).setUnFollowDiseaseButton(true);
}
} else {
holder.followDiseaseCheckBox.setChecked(false);
checkBoxClicked--;
holder.followDiseaseCheckBox.setChecked(false);
// for Follow.
if (isFollowOrUnFollow.equals("FOLLOW")) {
((FollowActivity) context).diseaseListFromAdapter.remove(String.valueOf(diseaseMap.get("id")));
}
// for Unfollow.
else if (isFollowOrUnFollow.equals("UN_FOLLOW")) {
((FollowTwoActivity) context).unFollowedDiseaseListFromAdapter.remove(String.valueOf(diseaseMap.get("id")));
}
if (checkBoxClicked == 0) {
// for Follow.
if (isFollowOrUnFollow.equals("FOLLOW")) {
((FollowActivity) context).setFollowButton(false);
((FollowActivity) context).diseaseListFromAdapter.clear();
}
// for Unfollow.
else if (isFollowOrUnFollow.equals("UN_FOLLOW")) {
((FollowTwoActivity) context).setUnFollowDiseaseButton(false);
((FollowTwoActivity) context).unFollowedDiseaseListFromAdapter.clear();
}
}
}
}
});
问题是当我选中一个复选框
时,在回收视图
中选中了该复选框
。但是当我签入适配器时,
项被正确添加,但是复选框
选择被重复
例如:如果我选中了第一项
复选框
并向下滚动第16项,则也会选中复选框
。取消选中复选框
也将取消选中第一项 回收器视图回收OnBindViewHolder中的视图。
因此,当单击项目时,它会反映在其他一些位置。
创建全局SparseBooleanArray以存储单击的位置
private final SparseBooleanArray array=new SparseBooleanArray();
然后在最终的viewholder中添加clickListener,然后单击存储被单击项目的位置
public class ViewHolder extends RecyclerView.ViewHolder {
public YOURVIEW view;
public ViewHolder(View v) {
super(v);
view = (YOURVIEW) v.findViewById(R.id.YOURVIEWID);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
array.put(getAdapterPosition(),true);
notifyDataSetChanged();
}
});
}
}
在Inner OnBindViewHolder中
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
if(array.get(position)){
holder.followDiseaseCheckBox.setChecked(true);
}else{
holder.followDiseaseCheckBox.setChecked(false);
}
}
公共类CardViewDataAdapter扩展了RecyclerView.Adapter{
私人名单;
公共卡ViewDataAdapter(列出学生){
this.stList=学生;
}
@凌驾
public CardViewDataAdapter.ViewHolder onCreateViewHolder(ViewGroup父级,int-viewType){
//创建新视图
View itemLayoutView=LayoutFlater.from(parent.getContext()).inflate(
R.layout.cardwiew_行,空);
//创建视图持有者
ViewHolder ViewHolder=新的ViewHolder(itemLayoutView);
返回视图持有者;
}
@凌驾
公共无效onBindViewHolder(ViewHolder ViewHolder,int位置){
最终int pos=位置;
viewHolder.tvName.setText(stList.get(position.getName());
viewHolder.tveEmailId.setText(stList.get(position.getEmailId());
viewHolder.chkSelected.setChecked(stList.get(position.isSelected());
viewHolder.chkSelected.setTag(stList.get(position));
viewHolder.chkSelected.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
复选框cb=(复选框)v;
学生联系人=(学生)cb.getTag();
contact.setSelected(cb.isChecked());
stList.get(pos.setSelected)(cb.isChecked());
Toast.makeText(
v、 getContext(),
单击复选框:“+cb.getText()+”是”
+cb.isChecked(),Toast.LENGTH_LONG).show();
}
});
}
//返回大小数组列表
@凌驾
public int getItemCount(){
返回stList.size();
}
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图tvName;
公共文本视图TVMailID;
公众选举;
公立学生;
公共视图持有者(视图项布局视图){
超级(itemLayoutView);
tvName=(TextView)itemLayoutView.findViewById(R.id.tvName);
TveEmailId=(TextView)itemLayoutView.findViewById(R.id.TveEmailId);
chkSelected=(复选框)itemLayoutView.findviewbyd(R.id.chkSelected);
}
}
//更新所选内容后在“活动”中访问的方法
公共列表GetStudentList(){
返回stList;
}
}
要了解有关复选框选择的更多信息,请按此操作您可能缺少recylerview的一些概念。事实上,recyclerview在每9项之后绑定/回收相同的视图。因此,为了避免这种情况,只需在活动中使用
setItemViewCacheSize()
例如:
contactListAdapter = new ContactsListAdapter(ContactActivity.this, contactArrayList);
mRecyclerView.setItemViewCacheSize(contactArrayList.size());
mRecyclerView.setAdapter(contactListAdapter);
public void setItemViewCacheSize(int size)设置屏幕外的
在将视图添加到潜在共享视图之前要保留的视图
查看池。屏幕外的视图缓存可随时了解视图中的更改
附加的适配器,允许LayoutManager重用这些视图
未修改,无需返回适配器重新绑定。
参数:size-返回前要缓存到屏幕外的视图数
把它们放在普通的可回收景观池里
公共类SuggestionListAdapter扩展了RecyclerView.Adapter{
私有列表mSuggestionList;
私有上下文;
公共类SuggestionListViewHolder扩展了RecyclerView.ViewHolder{
专用复选框mCheckBox;
私人直系公寓;
公共建议列表视图持有者(查看项目视图){
超级(项目视图);
mCheckBox=(复选框)itemviewbyd(R.id.list\u display\u复选框);
mParent=(LinearLayout)itemviewbyd(R.id.list\u parentll);
}
}
public SuggestionListAdapter(列表suggestionList,上下文){
this.msSuggestionList=suggestionList;
this.mContext=上下文;
}
@凌驾
公共建议ListViewHolder onCreateViewHolder(视图组父级,int-viewType){
查看新的\u建议\u列表\u视图=LayoutInflater.from(parent.getContext()).flate(R.layout.suggestion\u列表,parent,false);
返回新建议列表视图持有者(新建议列表视图);
}
@凌驾
BindViewHolder上的公共无效(最终建议ListViewHolder,最终整型位置){
最终建议=mSuggestionList.get(位置);
holder.mCheckBox.setText(suggestion.getCategory());
holder.mCheckBox.setOnCheckedChangeListener(null);
holder.mCheckBox.setSelected(suggestion.isSelected());
holder.mCheckBox.setOnCheckedChangeListener(新的CompoundButton.OnCheckedChangeListener(){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查){
建议。已选择(正确);
}否则{
建议。已选择(错误);
}
}
});
holder.mCheckBox.setChecked(suggestion.isSelected());
}
@凌驾
public int getItemCount(){
返回mSuggestionList.size();
}
}
看看这个例子,我相信你会发现你犯了什么错误,你可以解决你的问题。@Shaido&alfakini-相关答案已经发布,我没有回答相同的解决方案,这就是为什么发布参考链接以加深理解的原因。我认为这将有助于澄清这一概念,因为将来SBAH链接可能会中断,因此最好在答案中包含相关信息。如果
contactListAdapter = new ContactsListAdapter(ContactActivity.this, contactArrayList);
mRecyclerView.setItemViewCacheSize(contactArrayList.size());
mRecyclerView.setAdapter(contactListAdapter);
public class SuggestionListAdapter extends RecyclerView.Adapter<SuggestionListAdapter.SuggestionListViewHolder> {
private List<Suggestion> mSuggestionList;
private Context mContext;
public class SuggestionListViewHolder extends RecyclerView.ViewHolder{
private CheckBox mCheckBox;
private LinearLayout mParent;
public SuggestionListViewHolder(View itemView) {
super(itemView);
mCheckBox = (CheckBox)itemView.findViewById(R.id.list_display_checkbox);
mParent =(LinearLayout)itemView.findViewById(R.id.list_parentll);
}
}
public SuggestionListAdapter(List<Suggestion> suggestionList, Context context) {
this.mSuggestionList = suggestionList;
this.mContext = context;
}
@Override
public SuggestionListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View new_suggestion_list_view = LayoutInflater.from(parent.getContext()).inflate(R.layout.suggestion_list,parent,false);
return new SuggestionListViewHolder(new_suggestion_list_view);
}
@Override
public void onBindViewHolder(final SuggestionListViewHolder holder, final int position) {
final Suggestion suggestion = mSuggestionList.get(position);
holder.mCheckBox.setText(suggestion.getCategory());
holder.mCheckBox.setOnCheckedChangeListener(null);
holder.mCheckBox.setSelected(suggestion.isSelected());
holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
suggestion.setSelected(true);
}else {
suggestion.setSelected(false);
}
}
});
holder.mCheckBox.setChecked(suggestion.isSelected());
}
@Override
public int getItemCount() {
return mSuggestionList.size();
}