Android 如何限制用户从 CheckBox ListView 中选择超过 10 个项目
How to restrict a user from selecting more than 10 items from a CheckBox ListView in Android
我找遍了,但找不到适合我情况的解决方案。我目前有一个从 ArrayAdapter 扩展的自定义复选框适配器,它包含 'Food' 个对象('Food' 包含 2 个属性 1. Boolean:Selected 和 2. String:Name)。当 listView 加载时,我默认选择了 10 个项目。我需要允许用户 unselect/select 选项,但将它们限制为只有 10 个选项。
import android.content.Context;
import android.util.Log;
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 android.widget.Toast;
import java.util.ArrayList;
public class CheckBoxAdapter extends ArrayAdapter<Food> {
Context context;
ArrayList<Food> foodList;
int counter = 0;
private static class ViewHolder {
TextView txtView;
CheckBox chkBox;
public ViewHolder(View view) {
txtView = (TextView) view.findViewById(R.id.food_text);
chkBox = (CheckBox) view.findViewById(R.id.food_box);
}
}
public CheckBoxAdapter(Context context, ArrayList<Food> food) {
super(context, 0, food);
this.context = context;
foodList = food;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Food food = getItem(position);
View row = convertView;
ViewHolder viewHolder = null;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.food_category_row, parent, false);
viewHolder = new ViewHolder(row);
row.setTag(viewHolder);
//Not sure if we need to use this - for now i think its useless...
viewHolder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag.
//foodList.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
if(isChecked){
counter++;
}
else if(isChecked){
counter--;
}
if(counter > 10){
foodList.get(getPosition).setSelected(!buttonView.isChecked());
counter--;
}
}
});
} else {
viewHolder = (ViewHolder) row.getTag();
}
viewHolder.chkBox.setTag(position); // This line is important.
viewHolder.txtView.setText(foodList.get(position).getName());
viewHolder.chkBox.setChecked(foodList.get(position).isSelected());
return row;
}
}
我建议你不要使用setOnCheckedChangeListener
。每次滚动时都会调用 getView 并且每次都会设置复选框,因此会调用侦听器。
我建议您使用 setOnClickListener
作为 cehckbox 并以这种方式维护复选框。
viewHolder.chkBox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag.
//foodList.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
if(viewHolder.chkBox.isChecked()){
viewHolder.chkBox.setChecked(false);
counter--;
}
else{
if(counter < 10){{
viewHolder.chkBox.setChecked(true);
counter++;
}
}
}
};
你需要做这样的事情:
viewHolder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int getPosition = (int) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag.
//foodList.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
if (isChecked) {
counter++;
} else {
counter--;
}
if (counter > 10) {
buttonView.setChecked(false); // no need to do counter-- because the listener will trigger again
}
}
});
我找遍了,但找不到适合我情况的解决方案。我目前有一个从 ArrayAdapter 扩展的自定义复选框适配器,它包含 'Food' 个对象('Food' 包含 2 个属性 1. Boolean:Selected 和 2. String:Name)。当 listView 加载时,我默认选择了 10 个项目。我需要允许用户 unselect/select 选项,但将它们限制为只有 10 个选项。
import android.content.Context;
import android.util.Log;
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 android.widget.Toast;
import java.util.ArrayList;
public class CheckBoxAdapter extends ArrayAdapter<Food> {
Context context;
ArrayList<Food> foodList;
int counter = 0;
private static class ViewHolder {
TextView txtView;
CheckBox chkBox;
public ViewHolder(View view) {
txtView = (TextView) view.findViewById(R.id.food_text);
chkBox = (CheckBox) view.findViewById(R.id.food_box);
}
}
public CheckBoxAdapter(Context context, ArrayList<Food> food) {
super(context, 0, food);
this.context = context;
foodList = food;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Food food = getItem(position);
View row = convertView;
ViewHolder viewHolder = null;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.food_category_row, parent, false);
viewHolder = new ViewHolder(row);
row.setTag(viewHolder);
//Not sure if we need to use this - for now i think its useless...
viewHolder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag.
//foodList.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
if(isChecked){
counter++;
}
else if(isChecked){
counter--;
}
if(counter > 10){
foodList.get(getPosition).setSelected(!buttonView.isChecked());
counter--;
}
}
});
} else {
viewHolder = (ViewHolder) row.getTag();
}
viewHolder.chkBox.setTag(position); // This line is important.
viewHolder.txtView.setText(foodList.get(position).getName());
viewHolder.chkBox.setChecked(foodList.get(position).isSelected());
return row;
}
}
我建议你不要使用setOnCheckedChangeListener
。每次滚动时都会调用 getView 并且每次都会设置复选框,因此会调用侦听器。
我建议您使用 setOnClickListener
作为 cehckbox 并以这种方式维护复选框。
viewHolder.chkBox.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag.
//foodList.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
if(viewHolder.chkBox.isChecked()){
viewHolder.chkBox.setChecked(false);
counter--;
}
else{
if(counter < 10){{
viewHolder.chkBox.setChecked(true);
counter++;
}
}
}
};
你需要做这样的事情:
viewHolder.chkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int getPosition = (int) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag.
//foodList.get(getPosition).setSelected(buttonView.isChecked()); // Set the value of checkbox to maintain its state.
if (isChecked) {
counter++;
} else {
counter--;
}
if (counter > 10) {
buttonView.setChecked(false); // no need to do counter-- because the listener will trigger again
}
}
});