带有复选框和自定义适配器的 ListView,片段无法正常工作

Posted

技术标签:

【中文标题】带有复选框和自定义适配器的 ListView,片段无法正常工作【英文标题】:ListView with checkbox and custom adapter, fragment not working properly 【发布时间】:2021-08-19 18:47:50 【问题描述】:

我想制作一个带有复选框的列表视图。但是复选框检查无法正常工作,只是检查了我列表中的第一个元素。你能帮我吗?这是我的代码

public class ToDoAdapter extends ArrayAdapter<ToDo> 

private FirebaseAuth mAuth;
FirebaseUser user;
FirebaseFirestore db;

private Context context;
private int resource;
private List<ToDo> list;
private LayoutInflater inflater;
CheckBox checkBox;
ToDo toDo;

public ToDoAdapter(@NonNull Context context, int resource, @NonNull List<ToDo> objects,
                   LayoutInflater inflater) 
    super(context, resource, objects);
    this.context=context;
    this.resource=resource;
    this.list=objects;
    this.inflater=inflater;


@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) 
    View view = inflater.inflate(resource,parent, false);
    mAuth = FirebaseAuth.getInstance();
    user = mAuth.getCurrentUser();
    db = FirebaseFirestore.getInstance();
    view.setClickable(true);
    view.setFocusable(true);
    view.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Bundle bundle = new Bundle();
            bundle.putSerializable("todoID",position);
            bundle.putSerializable("item", ToDoFragment.arrayAdapterToDo.getItem(position)
                    .getDetalii());
            bundle.putSerializable("deadline", ToDoFragment.arrayAdapterToDo.getItem(position)
                    .getDeadline().toString());
            ToDoFragment.getInstance().newFragment(bundle);
        
    );
    toDo = list.get(position);
    if(toDo!=null)
        addData(view, toDo.getDeadline());
        addDetalii(view, toDo.getDetalii());
        check(view, toDo.isEsteEfectuat());

    

    checkBox = view.findViewById(R.id.checkbox);

    checkBox.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            if(checkBox.isChecked()) 
*****
                checkBox.setChecked(true);
                toDo.setEsteEfectuat(true);
                updateCheckBox();
                view.setBackgroundColor(Color.parseColor("#008000"));
             else 
                checkBox.setChecked(false);
                toDo.setEsteEfectuat(false);
                updateCheckBox();
                view.setBackgroundColor(Color.parseColor("#FF0000"));
            
        
    );

    return view;

我怎样才能生成正确的位置,我的意思是要检查/取消检查的正确项目

如果我放一个 toast 而不是 ****,我会生成列表的第一项

【问题讨论】:

CheckBox checkBox; 删除那里并放入 getView()。 在复选框上放置一个 onCheckChangedListener。 它不起作用:( 什么不起作用?发布您的新代码。 【参考方案1】:

在@blackapps 的帮助下,试试这个:

CheckBox checkBox = view.findViewById(R.id.checkbox);
    checkBox.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            toDo = ToDoFragment.arrayAdapterToDo.getItem(position);
            if(checkBox.isChecked()) 
                checkBox.setChecked(true);
                toDo = ToDoFragment.arrayAdapterToDo.getItem(position);
                toDo.setEsteEfectuat(true);
                updateCheckBox();
                view.setBackgroundColor(Color.parseColor("#008000"));
             else  
                checkBox.setChecked(false);
                toDo = ToDoFragment.arrayAdapterToDo.getItem(position);
                toDo.setEsteEfectuat(false);
                updateCheckBox();
                view.setBackgroundColor(Color.parseColor("#FF0000"));
            
        
    );

【讨论】:

以上是关于带有复选框和自定义适配器的 ListView,片段无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

片段中的自定义列表适配器

带有复选框的自定义 ListView 检查未选中的项目

ListView 和自定义适配器在 Kotlin 中不起作用

带有 ListView 的片段:setAdapter 上的 NullPointerException

如何在 Fragment 和适配器之间创建接口?

滚动时带有复选框的Android ListView会松动选中的项目