我试图实现带有复选框的多选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());
}
}