When scrolling custom ListView, the checkbox value changes

前端 未结 8 1943
不思量自难忘°
不思量自难忘° 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

提交回复
热议问题