我在RecyclerView适配器的查看项目中有一个复选框 滚动时,会检查一些复选框,有些复选框未经检查 我从this和this获得了帮助 但我无法找到确切的解决方案。
这是我的代码
if-elseif
例如,我检查了列表中的1,2,3项。当我向下滚动并上升时,则检查13并且2与其他项目一起取消选中。请帮助我。
任何解决方案都表示赞赏。
答案 0 :(得分:0)
通知您的适配器。
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
phoneContactsModel.setChecked(b);
//notifyItemChanged(position);(if you want to notify change in single item)
//or
//notifyDataSetChanged();(if you want to notify change in all)
}
});
无需使用此行代码两次
holder.checkBox.setSelected(phoneContactsModel.isChecked());
//此部分似乎有些错误我假设您要在选中复选框时将项目添加到列表中,并在取消选中复选框时将其从列表中删除。
holder.contactLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (phoneContactsModel.isChecked()) {
holder.checkBox.setSelected(false);
copyOfListOfContacts.remove(listOfContacts.get(position));
} else {
holder.checkBox.setSelected(true);
copyOfListOfContacts.add(listOfContacts.get(position));
}
}
}
);
答案 1 :(得分:0)
简单的方法是不要使用OnCheckedChangeListener
只在复选框上设置OnClickListener
。在 ViewHolder 类中移动checkBox onclick。
public class ViewHolder1 extends RecyclerView.ViewHolder implements View.OnClickListener {
CheckBox checkBox;
public ViewHolder1(View itemView) {
super(itemView);
checkBox = (TextView) itemView.findViewById(R.id.checkBox);
checkBox.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(getAdapterPosition()!=-1) {
phoneContactsModel.get(getAdapterPosition()).setChecked(!phoneContactsModel.get(getAdapterPosition()).isChecked());
notifyItemChanged(getAdapterPosition());
}
}
}
并且
public void onBindViewHolder(final AllContactsAdapter.ViewHolder holder, final int position) {
holder.checkBox.setChecked(phoneContactsModel.isChecked());
}
答案 2 :(得分:0)
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
final PhoneContactsModel phoneContactsModel = listOfContacts.get(position);
holder.name.setText(phoneContactsModel.getContactName());
holder.phoneNumber.setText(phoneContactsModel.getContactNumber());
holder.checkBox.setChecked(/* gets value from the modal */ phoneContactsModel.isChecked());
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean value) {
if (compoundButton.isPressed()) {
holder.checkBox.setChecked(value);
// set the value into the modal.
phoneContactsModel.setChecked(value);
if (value) {
copyOfListOfContacts.remove(phoneContactsModel);
} else {
copyOfListOfContacts.add(phoneContactsModel);
}
}
}
});
}
像这样更改onBindViewHolder
方法。不会有任何不必要的检查。