简体   繁体   English

如何限制用户从Android中的CheckBox ListView选择超过10个项目

[英]How to restrict a user from selecting more than 10 items from a CheckBox ListView in Android

I've searched all over and cant find a solution that works for my situation. 我已经四处搜寻,找不到适合我情况的解决方案。 I currently have a custom checkbox adapter extending from ArrayAdapter that holds 'Food' objects ('Food' contains 2 attributes 1. Boolean:Selected and 2. String:Name). 我目前有一个自定义复选框适配器,它从ArrayAdapter扩展而来,可容纳“食物”对象(“食物”包含2个属性:1。Boolean:Selected和2。String:Name)。 When the listView loads I have 10 items that are selected by default. 当listView加载时,我默认选择了10个项目。 I need to allow a user to unselect/select options but limit them to only 10 choices. 我需要允许用户取消选择/选择选项,但只能将它们限制为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;

    }

}

I suggest you don't use setOnCheckedChangeListener . 我建议您不要使用setOnCheckedChangeListener getView call every time on scroll and checkbox is being set every time so listener called. 每次滚动时都会进行getView调用,并且每次都设置复选框,因此调用了侦听器。

I recommended you to use setOnClickListener for cehckbox and maintain checkbox in that way. 我建议您将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++;
             }
         }
        }
    }; 

You need to do something like that: 您需要执行以下操作:

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
            }

        }
    });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM