简体   繁体   中英

Checkbox unchecked when scroll in listview android

I using custom listview in my project and I have one problem. I added checkboxs in row inside listview using addview, but checkbox uncheked when scroll in listview. I tried settag/gettag by position but in my case one row has several checkboxs so I can't use position. how can I solve this problem? please help me..

public View getView(final int position, View convertView, final ViewGroup parent) {

    View itemView;
    final ViewHolder viewHolder;

    if (convertView == null) {
        itemView = layoutInflater.inflate(R.layout.activity_delivering_partner_item, parent, false);

         viewHolder = new ViewHolder();

        final Deliveryltem deliveryltemPosition = epicerieDelivery_delivering_recipient.selectedDeliveryItem.get(position);

        time = (TextView) itemView.findViewById(R.id. delivering_item_time);
        name = (TextView) itemView.findViewById(R.id.delivering_item_name);
        address = (TextView) itemView.findViewById(R.id.delivering_item_address);
        goods = (TextView) itemView.findViewById(R.id.delivering_item_goods);
        partner_linear = (LinearLayout) itemView.findViewById(R.id.delivering_partner_goods_linear);
        LayoutInflater layoutInflater =
                (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        partner_linear.removeAllViews();

        String purchase_name = "";


            purchase_name = deliveringListActivity.purchase_name_arr.get(deliveringListActivity.purchase_num);


        time.setText(deliveryltemPosition.shipping_time);

        address.setText(deliveryltemPosition.recipient_address);


            for(int k = 0; k< deliveringListActivity.partner_goods_arr.size(); k++){

                final View addView = layoutInflater.inflate(R.layout.activity_delivering_partner_item_row, null);

                TextView goods_name = (TextView) addView.findViewById(R.id.partner_goods_name_row);
                TextView goods_ea = (TextView) addView.findViewById(R.id.partner_goods_ea_row);
                viewHolder.checkbox = (CheckBox) addView.findViewById(R.id.partner_goods_chbox);

                viewHolder.checkbox.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                        viewHolder.checkbox.setId(position);

                    }
                });

                if(deliveryltemPosition.delivery_order_id.equals(deliveringListActivity.partner_goods_arr.get(k).goods_order_id)){


                    if(deliveringListActivity.partner_goods_arr.get(k).detail_purchase.equals(purchase_name)){

                        goods_name.setText(deliveringListActivity.partner_goods_arr.get(k).detail_product_name);
                        goods_ea.setText(deliveringListActivity.partner_goods_arr.get(k).detail_ea);

                        partner_linear.addView(addView);

                    }else{
                    }

                }else{

                }


        }

        return itemView;


    }else{
        itemView = convertView;

       viewHolder = new ViewHolder();

        if(epicerieDelivery_delivering_recipient.selectedDeliveryItem.size() != 0){

            final Deliveryltem deliveryltemPosition = epicerieDelivery_delivering_recipient.selectedDeliveryItem.get(position);

            time = (TextView) itemView.findViewById(R.id. delivering_item_time);
            name = (TextView) itemView.findViewById(R.id.delivering_item_name);
            address = (TextView) itemView.findViewById(R.id.delivering_item_address);
            partner_linear = (LinearLayout) itemView.findViewById(R.id.delivering_partner_goods_linear);
            LayoutInflater layoutInflater =
                    (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            partner_linear.removeAllViews();


            time.setText(deliveryltemPosition.shipping_time);

            address.setText(deliveryltemPosition.recipient_address);

            String purchase_name = "";

               purchase_name = deliveringListActivity.purchase_name_arr.get(deliveringListActivity.purchase_num);




                for(int k = 0; k< deliveringListActivity.partner_goods_arr.size(); k++){


                    final View addView = layoutInflater.inflate(R.layout.activity_delivering_partner_item_row, null);

                    TextView goods_name = (TextView) addView.findViewById(R.id.partner_goods_name_row);
                    TextView goods_ea = (TextView) addView.findViewById(R.id.partner_goods_ea_row);
                    viewHolder.checkbox = (CheckBox) addView.findViewById(R.id.partner_goods_chbox);


                    viewHolder.checkbox.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {

                           viewHolder.checkbox.setId(position);

                        }
                    });

                    if(deliveryltemPosition.delivery_order_id.equals(deliveringListActivity.partner_goods_arr.get(k).goods_order_id)){


                        if(deliveringListActivity.partner_goods_arr.get(k).detail_purchase.equals(purchase_name)){

                            goods_name.setText(deliveringListActivity.partner_goods_arr.get(k).detail_product_name);
                            goods_ea.setText(deliveringListActivity.partner_goods_arr.get(k).detail_ea);
                            partner_linear.addView(addView);
                        }else{

                        }
                    }else{

                    }
               }
        }
        return convertView;
    }

}

Your approach for using ViewHolder is wrong i think. Inside your overrided getView method you need to change like below example.

    if (convertView == null) {
        //Your stuffs     
    }else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

According to the documentation:

Your code might call findViewById() frequently during the scrolling of ListView, which can slow down performance. Even when the Adapter returns an inflated view for recycling, you still need to look up the elements and update them. A way around repeated use of findViewById() is to use the "view holder" design pattern.

This could help you:

It is because you are not maintaining the check box states which means when you click on the check box you need to store it in an variable , this variable should be in model class and depending on the variable states you need to show the check boxes.

删除if(convertView == null)else条件,或者记住pojo类的检查更改并设置pojo类的复选框

Save the checkbox status of each position in an array and using this status, set the checkbox as checked or not. Please refer the solution for this problem in this link : listview with checkbox status changed when scoll

1. First you have to initialize boolean array in global in adapter

boolean[] checkedPositions = {false, false, false, false, false, false, false,
        false, false, false, false, false, false, false, false, false};

boolean size with false's is list size if your list has 4 rows then write like this boolean[] checkedPositions = {false, false, false, false}

2. On check box listener

checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if (b) {
                checkedPositions[position] = true;
            } else {
                checkedPositions[position] = false;
            }
        }
    });

3. After this code you have to write this code

checkbox.setChecked(checkedPositions[position]);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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