When scrolling custom ListView, the checkbox value changes

前端 未结 8 1942
不思量自难忘°
不思量自难忘° 2020-12-05 07:30


What I have: a custom listview with Textviews and checkbox.


Problem: Suppose my screen can show only 6 items of list at time, and
相关标签:
8条回答
  • 2020-12-05 08:01

    Check the code below -

    public View getView(int position, View convertView, ViewGroup parent){
                View view = convertView;
                ViewHolder holder = new ViewHolder();
    
                if(view == null){
    
                    view = inflater.inflate(R.layout.list_callcycle_blue, null);                
                    holder.llContainer = (LinearLayout) view.findViewById(R.id.ll_container);
                    holder.lblLabel = (TextView) view.findViewById(R.id.txt_desc);
                    holder.cb = (CheckBox) view.findViewById(R.id.cb_store);
    
                    view.setTag(holder);
                } else {
                    holder = (ViewHolder) view.getTag();
                }
    
                final Object data = getItem(position);
                holder.lblLabel.setText(data.getDescription());
    
                holder.cb.setTag(position);
                holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    
                        int position = (Integer) buttonView.getTag();
                        objects.get(position).setChecked(buttonView.isChecked());
                    }
                });
                holder.cb.setChecked(isChecked(position));
    
                return view;
            }
    

    Always keep in mind, use change holder.cb.setOnCheckedChangeListener() i.e. any listener before it's setting data, in our case it is holder.cb.setChecked()

    Reason : When we scroll, listview will recycle the views, so if setchecked is used before listeners then it will pick values on the basis of old listener. And if we set it after listener, then it will take latest values

    0 讨论(0)
  • 2020-12-05 08:05

    You need to update the adapter to retain the value of checkbox

    holder.chk.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    CheckBox c = (CheckBox)v.findViewById(R.id.chkID);
                    Boolean chk = c.isChecked();
                    Integer pos = (Integer)v.getTag();
                    itemList.get(pos).setChk(chk);
    
                }
            });
    

    For more help you can refer this post in Retain Checkbox value

    0 讨论(0)
提交回复
热议问题