Android 如何在recyclerview中保存复选框位置?
我有一份清单。列表项有一个复选框。我想保存项目的状态。状态保存为0或1 我根据状态0或1显示复选框已选中或未选中 它有时显示正确,但当我上下滚动时,更多的项目被选中或取消选中,这是我没有手动完成的 适配器:Android 如何在recyclerview中保存复选框位置?,android,checkbox,position,android-recyclerview,android-adapter,Android,Checkbox,Position,Android Recyclerview,Android Adapter,我有一份清单。列表项有一个复选框。我想保存项目的状态。状态保存为0或1 我根据状态0或1显示复选框已选中或未选中 它有时显示正确,但当我上下滚动时,更多的项目被选中或取消选中,这是我没有手动完成的 适配器: public class CheckListItemAdapter extends RecyclerView.Adapter<CheckListItemAdapter.MyViewHolder>{ private List<CheckListItem>
public class CheckListItemAdapter extends RecyclerView.Adapter<CheckListItemAdapter.MyViewHolder>{
private List<CheckListItem> checkListItems;
Context context;
private String status;
private final OnItemClickListener listener;
public interface OnItemClickListener {
void onItemClick(CheckListItem item);
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView title, budget;
public RelativeLayout parent;
private CheckBox checkBox;
public MyViewHolder(View view) {
super(view);
title = (TextView) view.findViewById(R.id.title);
budget =(TextView) view.findViewById(R.id.budget);
checkBox = (CheckBox) view.findViewById(R.id.checkBox);
}
public void bind(final CheckListItem item, final OnItemClickListener listener) {
itemView.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
listener.onItemClick(item);
}
});
}
}
public CheckListItemAdapter(List<CheckListItem> checkListItems,Context context,OnItemClickListener listener) {
this.checkListItems = checkListItems;
this.context = context;
this.listener = listener;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.checklist_item, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
final CheckListItem item = checkListItems.get(position);
holder.title.setText(item.getTitle());
holder.budget.setText(item.getBudget());
status = item.getStatus();
if(status.equals("1"))
{
holder.checkBox.setChecked(true);
}
if(status.equals("0")) {
holder.checkBox.setChecked(false);
}
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
status = "1";
HashMap<String, String> params = new HashMap<String, String>();
params.put("checklistItemId", item.getCheckListItemId());
params.put("budget",item.getBudget());
params.put("text", item.getTitle());
params.put("time_due", item.getDateTime());
params.put("reminder",item.getReminder());
params.put("status", status);
new UpdateCheckListItemsAsyncTask(context).execute(params);
} else
{
status = "0";
HashMap<String, String> params = new HashMap<String, String>();
params.put("checklistItemId", item.getCheckListItemId());
params.put("budget",item.getBudget());
params.put("text", item.getTitle());
params.put("time_due", item.getDateTime());
params.put("reminder",item.getReminder());
params.put("status", status);
new UpdateCheckListItemsAsyncTask(context).execute(params);
}
}
});
holder.bind(checkListItems.get(position), listener);
}
@Override
public int getItemCount() {
return checkListItems.size();
}
}
公共类CheckListItemAdapter扩展了RecyclerView.Adapter{
私人清单项目;
语境;
私有字符串状态;
私人终场监听者;
公共接口侦听器{
void onItemClick(检查列表项);
}
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图标题、预算;
公共关系青年家长;
私有复选框;
公共MyViewHolder(视图){
超级(视图);
title=(TextView)view.findViewById(R.id.title);
budget=(TextView)view.findViewById(R.id.budget);
checkBox=(checkBox)view.findviewbyd(R.id.checkBox);
}
公共void绑定(最终CheckListItem项,最终监听器){
itemView.setOnClickListener(新视图.OnClickListener(){
@覆盖公共void onClick(视图v){
listener.onItemClick(项);
}
});
}
}
public CheckListItemAdapter(列出checkListItems、上下文上下文和侦听器){
this.checkListItems=checkListItems;
this.context=上下文;
this.listener=listener;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.checklist_项,父项,假);
返回新的MyViewHolder(itemView);
}
@凌驾
公共无效onBindViewHolder(最终MyViewHolder,内部位置){
最终CheckListItem项目=checkListItems.get(位置);
holder.title.setText(item.getTitle());
holder.budget.setText(item.getBudget());
status=item.getStatus();
如果(状态等于(“1”))
{
holder.checkBox.setChecked(true);
}
如果(状态等于(“0”)){
holder.checkBox.setChecked(false);
}
setOnCheckedChangeListener(newcompoundButton.OnCheckedChangeListener()){
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
如果(已检查){
status=“1”;
HashMap params=新的HashMap();
put(“checklistItemId”,item.getCheckListItemId());
参数put(“预算”,item.getBudget());
put(“text”,item.getTitle());
参数put(“time_due”,item.getDateTime());
参数put(“提醒”,item.getrementer());
参数put(“状态”,状态);
新的UpdateCheckListItemsAsyncTask(上下文).execute(参数);
}否则
{
status=“0”;
HashMap params=新的HashMap();
put(“checklistItemId”,item.getCheckListItemId());
参数put(“预算”,item.getBudget());
put(“text”,item.getTitle());
参数put(“time_due”,item.getDateTime());
参数put(“提醒”,item.getrementer());
参数put(“状态”,状态);
新的UpdateCheckListItemsAsyncTask(上下文).execute(参数);
}
}
});
绑定(checkListItems.get(position),侦听器);
}
@凌驾
public int getItemCount(){
返回checkListItems.size();
}
}
这里怎么了?如何保存复选框的位置
谢谢..我也遇到过类似的问题 问题是,在RecyclerView中,ViewHolder被回收。因此,在
删除oncheckedchangedlistener
之前,这些项将引用旧的oncheckedchangedlistener
if(status.equals("1"))
{
holder.checkBox.setChecked(true);
}
if(status.equals("0")) {
holder.checkBox.setChecked(false);
}
这些行实际上触发了旧的onCheckedChangedListener
你可以试试这个
holder.checkBox.setOnCheckedChangeListener(null)代码>作为onBindViewHolder的第一行
getLayoutPosition()
HashSet
存储选中列表项的数据。
在类对象中存储它的方式也很好
编辑-添加代码以供参考
public class CheckListItemAdapter extends RecyclerView.Adapter<CheckListItemAdapter.MyViewHolder> {
...
..
public CheckListItemAdapter(List<CheckListItem> checkListItems, Context context, OnItemClickListener listener) {
this.checkListItems = checkListItems;
this.context = context;
this.listener = listener;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
....
....
if(item.getStatus().equals("1"))
{
holder.checkBox.setChecked(true);
}
else {
holder.checkBox.setChecked(false);
}
public MyViewHolder(View view) {
super(view);
title = (TextView) view.findViewById(R.id.title);
budget = (TextView) view.findViewById(R.id.budget);
checkBox = (CheckBox) view.findViewById(R.id.checkBox);
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int pos = getLayoutPosition();
CheckListItem currentItem=checkListItems.get(pos);
//to remove redundant calls to network while scrolling
if ( isChecked){
if (currentItem.getStatus().equals("1")) {
return;
} else {
currentItem.setStatus("1");
}
} else {
if (currentItem.getStatus().equals("0")) {
return;
} else {
currentItem.setStatus("0");
}
}
//network call, when check is changed
checkChangedLogic(checkListItems.get(pos), isChecked);
}
});
}
}
公共类CheckListItemAdapter扩展了RecyclerView.Adapter{
...
..
public CheckListItemAdapter(列出checkListItems、上下文上下文和侦听器){
this.checkListItems=checkListItems;
this.context=上下文;
this.listener=listener;
}
@凌驾
公共无效onBindViewHolder(最终MyViewHolder,内部位置){
....
....
if(item.getStatus()等于(“1”)
{
holder.checkBox.setChecked(true);
}
否则{
holder.checkBox.setChecked(false);
}
公共MyViewHolder(视图){
超级(视图);
title=(TextView)view.findViewById(R.id.title);
budget=(TextView)view.findViewById(R.id.budget);
checkBox=(checkBox)view.findviewbyd(R.id.checkBox);
setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener(){
@凌驾
setOnCheckedChangeListener(新建CompoundButton.OnCheckedChangeListener(){
@爱