Here is my code,
View Holder Class :
private class ViewHolder {
TextView tv1;
TextView tv2;
TextView tv3;
TextView tv4;
TextView tv5;
TextView tv6;
TextView tv7;
TextView tv8;
TextView tv9;
TextView tv10;
TextView tv11;
TextView tv12;
TextView tv13;
TextView tv14;
EditText edit_qty;
Button btnbonus;
Button btnremove;
}
ListView Custom Adapters getView() :
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
ViewHolder holder = null;
View view = convertView;
if(view == null){
view = lInflater.inflate(R.layout.add_productqty_listitem, parent,
false);
Typeface font = Typeface.createFromAsset(ctx.getAssets(),
"gothic.ttf");
holder = new ViewHolder();
final ProductInfo product = data.get(position);
ctx.mProductIdList.add(product.getProductId());
try {
holder.tv1 = (TextView) view
.findViewById(R.id.add_product_label);
holder.tv1.setText(product.getProductName());
holder.tv1.setTypeface(font);
holder.tv1.setVisibility(View.VISIBLE);
holder.tv2 = (TextView) view
.findViewById(R.id.Product_Code_label);
holder.tv2.setTypeface(font);
holder.tv2.setVisibility(View.VISIBLE);
...............
...............
holder.edit_qty.setVisibility(View.VISIBLE);
view.setTag(holder);
} catch (Exception e) {
e.printStackTrace();
}
}else{
holder = (ViewHolder) view.getTag();
}
return view;
}
I dont know whether the implement of view holder is correct or not , ListView has n number of duplicates which has been populated earlier , your help will be thankfull
Set the values once you get the holder object from getTag or first row initlization. so it should after if.. else condition checking
Check the comment also i hve mentioned in getview Method after if.. else
statment
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
ViewHolder holder = null;
View view = convertView;
if(view == null){
view = lInflater.inflate(R.layout.add_productqty_listitem, parent,
false);
holder = new ViewHolder();
try{ Typeface font = Typeface.createFromAsset(ctx.getAssets(),
"gothic.ttf");
holder.tv1 = (TextView) view
.findViewById(R.id.add_product_label);
holder.tv1.setTypeface(font);
holder.tv2 = (TextView) view
.findViewById(R.id.Product_Code_label);
holder.tv2.setTypeface(font);
view.setTag(holder);
} catch (Exception e) {
e.printStackTrace();
}
}else{
holder = (ViewHolder) view.getTag();
}
final ProductInfo product = data.get(position);
ctx.mProductIdList.add(product.getProductId());
// set data , text and visibility option after getting holder from view's getTag()
holder.tv1.setText(product.getProductName());
holder.tv1.setVisibility(View.VISIBLE);
holder.tv2.setVisibility(View.VISIBLE);
...............
...............
holder.edit_qty.setVisibility(View.VISIBLE);
return view;
I have updated your code. Try this.
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
ViewHolder holder = null;
View view = convertView;
if(view == null){
view = lInflater.inflate(R.layout.add_productqty_listitem, parent,
false);
holder = new ViewHolder();
holder.tv1 = (TextView) view
.findViewById(R.id.add_product_label);
holder.tv2 = (TextView) view
.findViewById(R.id.Product_Code_label);
view.setTag(holder);
}else{
holder = (ViewHolder) view.getTag();
}
Typeface font = Typeface.createFromAsset(ctx.getAssets(),
"gothic.ttf");
final ProductInfo product = data.get(position);
ctx.mProductIdList.add(product.getProductId());
try {
holder.tv1.setText(product.getProductName());
holder.tv1.setTypeface(font);
holder.tv1.setVisibility(View.VISIBLE);
holder.tv2.setTypeface(font);
holder.tv2.setVisibility(View.VISIBLE);
...............
...............
holder.edit_qty.setVisibility(View.VISIBLE);
} catch (Exception e) {
e.printStackTrace();
}
return view;
}
来源:https://stackoverflow.com/questions/28105826/listview-view-holder-returning-duplicate-rows-multiple-times