【发布时间】:2021-06-19 03:57:22
【问题描述】:
假设我检查了一个项目的checkbox,这也会用相应项目的ID 更新database 中的ischecked 列。然后我向下滚动并返回顶部,然后最顶部的项目checkbox 自动为unchecked 并且数据库也被更新。即使假设我检查顶部的两个项目,当我向下滚动最底部的两个项目时,checkboxes 也会自动检查。我该如何解决recyclerView 中的这个问题?
// costume adapter class
public class DataBeanAdapter extends RecyclerView.Adapter<DataBeanAdapter.ViewHolder> implements View.OnCreateContextMenuListener {
public List<dataBean> items;
public int itemLayout;
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo contextMenuInfo) {
menu.setHeaderTitle("Select The Action");
menu.add(0, v.getId(), 0, "Call");//groupId, itemId, order, title
menu.add(0, v.getId(), 0, "SMS");
}
public DataBeanAdapter(List<dataBean> items, int itemLayout) {
this.items = items;
this.itemLayout = itemLayout;
}
@Override
public DataBeanAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(itemLayout, parent, false);
return new ViewHolder(v);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
// On loading the activity recyclerview, setting properties to each list items
// fetch id with the given item postition
Cursor cc = myDB.getCursorByPosition(position);
String idd = cc.getString(cc.getColumnIndex("_id"));
String taskval = myDB.getTaskValue(idd);
dataBean item = items.get(position); // trash
holder.tasks.setText(taskval.trim());
String iscGet = myDB.getischecked(idd); // false by default
if (items.get(position).getChecked() == true) {
holder.isc.setChecked(true);
items.get(position).setChecked(true);
} else if (items.get(position).getChecked() == false) {
holder.isc.setChecked(false);
items.get(position).setChecked(false);
} else {
//leave
}
// set inflated checkbox to null
// holder.isc.setOnCheckedChangeListener(null);
// holder.isc.setChecked(myAdapter.items.contains(items.get(position)));
holder.isc.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
Boolean ischecked = items.get(position).getChecked();
if (ischecked == false) {
Cursor cx = myDB.getCursorByPosition(position);
String idx = cx.getString(cx.getColumnIndex("_id"));
myDB.updateCheck(idx);
items.get(position).setChecked(true);
} else {
Cursor cx = myDB.getCursorByPosition(position);
String idx = cx.getString(cx.getColumnIndex("_id"));
myDB.updateunCheck(idx);
items.get(position).setChecked(false);
}
}
});
holder.tasks.setOnCreateContextMenuListener(MainActivity.this);
holder.more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Cursor c = myDB.getCursorByPosition(position);
String id = c.getString(c.getColumnIndex("_id"));
Intent intent = new Intent(MainActivity.this, edit.class);
intent.putExtra("taskpos", Integer.toString(position));
intent.putExtra("taskid", id);
startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return items.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView tasks;
public CheckBox isc;
public ImageView more;
public ViewHolder(View itemView) {
super(itemView);
tasks = (TextView) itemView.findViewById(R.id.taskline);
isc = (CheckBox) itemView.findViewById(R.id.cbox);
more = (ImageView) itemView.findViewById(R.id.more);
// https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html#isRecyclable()
// this.setIsRecyclable(false); /// prevents checkbox misbehaving
}
}
}
public List<dataBean> getAllData() {
List<dataBean> list = new ArrayList<>();
Cursor cursor = myDB.SelectData();
while (cursor.moveToNext()) {
int tasks = cursor.getColumnIndex("tasklist");
int ischecked = cursor.getColumnIndex("ischecked");
String tasksv = cursor.getString(tasks);
String ic = cursor.getString(ischecked);
dataBean bean = new dataBean(tasksv, Boolean.parseBoolean(ic));
list.add(bean);
}
return list;
}
【问题讨论】:
标签: android checkbox android-recyclerview