我试图实现带有复选框的多选ListView,并且定义了一个自定义适配器类,如下所示:

package com.ameer.easycooking;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class CategoryAdapter extends ArrayAdapter<String> {

    private List<String> categoryList;
    private Context context;
    private List<String> selected = new ArrayList<>();

    public CategoryAdapter(List<String> categoryList, Context context) {
        super(context, R.layout.category_list_item, categoryList);
        this.categoryList = categoryList;
        this.context = context;
    }

    public static class CategoryHolder {
        private CheckBox checkBox;
        private TextView categoryName;

        public CategoryHolder(CheckBox checkBox, TextView categoryName) {
            this.checkBox = checkBox;
            this.categoryName = categoryName;
        }

        public CheckBox getCheckBox() {
            return checkBox;
        }

        public void setCheckBox(CheckBox checkBox) {
            this.checkBox = checkBox;
        }

        public TextView getCategoryName() {
            return categoryName;
        }

        public void setCategoryName(TextView categoryName) {
            this.categoryName = categoryName;
        }
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;

        CategoryHolder holder = new CategoryHolder((CheckBox) v.findViewById(R.id.checkBox), (TextView) v.findViewById(R.id.name));

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.category_list_item, null);

            holder.getCheckBox().setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        if (isChecked) {
                            selected.add(holder.getCheckBox().getText().toString());
                        }else{
                            selected.remove(holder.getCheckBox().getText().toString());
                        }
                }
            });
            v.setTag(holder);
        } else {
            holder = (CategoryHolder) v.getTag();
        }

        String category = categoryList.get(position);
        holder.categoryName.setText(category);
        holder.checkBox.setTag(category);

        return v;
    }

    public List<String> getSelected() {
        return selected;
    }
}


我想将选中的项目存储在selected列表中,然后在课程结束时使用getter检索它们,但这是告诉我'holder'需要声明为final,如果我声明为final,我可以不再使用holder = (CategoryHolder) v.getTag();为其分配值,因此解决一个问题就是创建另一个问题。 :(我该如何解决?

提前致谢。

最佳答案

您可以从OnCheckedChangeListener的参数获取必要的信息:buttonView是选中的元素。因此,您需要做的是以下几点:

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
       CheckBox checkbox;
       if (buttonView instanceof CheckBox )
       {
           checkbox = (CheckBox)buttonView;
       }
       else return;

       if (isChecked) {
            selected.add(checkbox.getText().toString());
       }else{
            selected.remove(checkbox.getText().toString());
       }
}

10-06 13:33
查看更多