使用listiview取消选中的Onscroll选中复选框

时间:2016-02-22 11:52:10

标签: android listview baseadapter android-checkbox

在我的应用程序中,我添加checkbox ListView,我也限制checkbox,用户不能选择超过5 checkbox,但问题是滚动我选中的checkbox取消选中以下是我的代码段,任何人都可以帮我这个

public class CustomAdapter extends BaseAdapter {

    private LayoutInflater inflater = null;
    Context context;

    String rup = "\u20B9";
    private ArrayList<ModelPooja> listData;
    boolean checked[];

    public CustomAdapterPooja(Context mainActivity, ArrayList<ModelPooja> listData) {
        // TODO Auto-generated constructor stub

        context = mainActivity;
        this.listData = listData;
        inflater = (LayoutInflater) context.
                getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        checked = new boolean[listData.size()];
        for (int i = 0; i < checked.length; i++) {
            checked[i] = listData.get(i).isselected;
        }

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return listData.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }


    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
         final ViewHolder holder;

       if (convertView == null) {
        holder = new ViewHolder();
        convertView = inflater.inflate(R.layout.list_item_poojaselection, null);
        holder.tv = (TextView) convertView.findViewById(R.id.list_item_poojaname);
        holder.serviceprice = (TextView) convertView.findViewById(R.id.list_item_poojaprice);
        holder.dayss = (TextView) convertView.findViewById(R.id.list_item_poojadays);
        holder.txtseledates = (TextView) convertView.findViewById(R.id.selecteddatess);
        holder.checks = (CheckBox) convertView.findViewById(R.id.list_item_poojacheck);

       convertView.setTag(holder);

     }else {
           holder = (ViewHolder) convertView.getTag();
       }
        holder.checks.setOnCheckedChangeListener(null);
        holder.checks.setFocusable(false);

        holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton cb, boolean b) {

                if (checkMaxLimit()) {

                    if (listData.get(position).isselected && b) {
                        holder.checks.setChecked(false);
                        listData.get(position).isselected = false;

                    } else {
                        holder.checks.setChecked(false);
                        listData.get(position).isselected = false;
                        Toast.makeText(context, "Max limit reached", Toast.LENGTH_SHORT).show();

                    }
                } else {
                    if (b) {
                        listData.get(position).isselected = true;
                    } else {
                        listData.get(position).isselected = false;
                    }
                }

            }
        });
        if (listData.get(position).isselected()) {
            holder.checks.setChecked(true);
        } else {
            holder.checks.setChecked(false);
        }

        holder.tv.setText(listData.get(position).getPOOJA_LISTING_NAME());
        holder.dayss.setText(listData.get(position).getPOOJA_LISTING_DAYS());
        holder.serviceprice.setText(rup + listData.get(position).getPOOJA_LISTING_AMOUNT());

        return convertView;
    }

    public boolean checkMaxLimit() {
        int countermax = 0;
        for (int i = 0; i < checked.length; i++) {
            checked[i] = false;
            checked[i] = listData.get(i).isselected();
            if (listData.get(i).isselected()) {
                countermax++;
            }
        }
        return countermax >= 5 ? true : false;
    }

    public class ViewHolder {
        TextView tv;
        TextView serviceprice;
        public CheckBox checks;
        public TextView dayss;
        public TextView txtseledates;
    }


}

4 个答案:

答案 0 :(得分:3)

问题出在你的getView()方法中。您设置OnCheckedChangeListener,然后将checkbox设置为true或false,从而触发该侦听器中的回调。你应该首先设置复选框检查状态,然后设置OnCheckedChangeListener

另外,boolean checked []字段没用,所以我简化了你的代码:

 public class CustomAdapter extends BaseAdapter {
    private final LayoutInflater inflater;
    private final Context context;
    private List<ModelPooja> listData;

    public CustomAdapter(Context mainActivity, List<ModelPooja> listData) {
        context = mainActivity;
        this.listData = listData;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return listData.size();
    }

    @Override
    public Object getItem(int position) {
        return listData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = inflater.inflate(R.layout.list_item_poojaselection, null);
            holder.tv = (TextView) convertView.findViewById(R.id.list_item_poojaname);
            holder.checks = (CheckBox) convertView.findViewById(R.id.list_item_poojacheck);
            convertView.setTag(holder);
        }else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.checks.setOnCheckedChangeListener(null);
        holder.checks.setFocusable(false);

        if (listData.get(position).isselected) {
            holder.checks.setChecked(true);
        } else {
            holder.checks.setChecked(false);
        }

        holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton cb, boolean b) {

                if (checkMaxLimit()) {

                    if (listData.get(position).isselected && b) {
                        holder.checks.setChecked(false);
                        listData.get(position).isselected = false;

                    } else {
                        holder.checks.setChecked(false);
                        listData.get(position).isselected = false;
                        Toast.makeText(context, "Max limit reached", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    if (b) {
                        listData.get(position).isselected = true;
                    } else {
                        listData.get(position).isselected = false;
                    }
                }
            }
        });

        holder.tv.setText(listData.get(position).getPOOJA_LISTING_NAME());
        return convertView;
    }

    public boolean checkMaxLimit() {
        int countermax = 0;
        for(ModelPooja item : listData){
            if(item.isselected){
                countermax++;
            }
        }
        return countermax >= 5;
    }

    public class ViewHolder {
        TextView tv;
        public CheckBox checks;
    }
}

答案 1 :(得分:1)

最初在adapter中使用false值创建一个布尔数组。如果用户检查数组,则make数组的位置为true。取消选中后将其设为false。始终从该布尔数组中设置复选框值。

答案 2 :(得分:0)

这是因为当您从手机的上方或下方滚动列表视图时,会重新生成列表视图的所有项目并将它们设置为默认值。 要避免这种情况,请创建一个模型类,它保存checkbox的当前值(true或false),并通过从该模型实例调用getter方法设置适配器中checkbox的值。 例如:

model.java

public class AddressModel {

    private boolean isChecked;
    private String address;
    private int alAddressDelete;

    public AddressModel(){

    }
    public AddressModel(boolean isChecked, String address, int alAddressDelete) {
        this.isChecked = isChecked;
        this.address = address;
        this.alAddressDelete = alAddressDelete;
    }

    public boolean getIsChecked() {
        return isChecked;
    }

    public void setIsChecked(boolean isChecked) {
        this.isChecked = isChecked;
    }
}

在您的Adapter类中,通过调用setIsChecked(boolean isChecked)中的setOnCheckedChangeListener()来设置复选框的值。 致电getIsChecked(),在其中设置复选框的价值。

答案 3 :(得分:0)

首先调用something,然后调用setOnCheckedChangeListener(),否则setChecked()将触发上一个ViewHolder对象的setChecked()