0

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;
    }

}
Hye Rim Hyeon
  • 47
  • 1
  • 7

5 Answers5

1

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.

Alex Chengalan
  • 8,211
  • 4
  • 42
  • 56
1

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.

Naveen Shriyan
  • 1,266
  • 1
  • 9
  • 15
  • I can't use position to maintaining the checkbox states. because row has sevral checkbox in my listview. how can do maintaining the checkbox states? – Hye Rim Hyeon May 31 '16 at 07:37
  • u can use the position only but u need the model class object for each row in that create varialbes equal to check boxes, then assign it true or false according to check box clicked thats it.. – Naveen Shriyan May 31 '16 at 08:23
0

remove your if (convertView == null) else condition, or remember your check change with pojo class and set check box from pojo class

J.D.
  • 1,401
  • 1
  • 12
  • 21
0

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

Community
  • 1
  • 1
Phoenix
  • 238
  • 2
  • 12
0

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]);
Ashok Reddy M
  • 330
  • 3
  • 9