Reputation: 47
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;
}
}
Upvotes: 0
Views: 983
Reputation: 330
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]);
Upvotes: 0
Reputation: 238
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
Upvotes: 0
Reputation: 1234
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.
Upvotes: 1
Reputation: 8281
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.
Upvotes: 1
Reputation: 1411
remove your if (convertView == null) else condition, or remember your check change with pojo class and set check box from pojo class
Upvotes: 0