列出getview中重复的项目位置

时间:2013-11-09 06:41:52

标签: android listview view baseadapter

我正在使用baseadapter创建一个自定义列表视图。我的列表中有10个列表项。我的问题是afetr 6项,前4个是重复。我只是在getview.it中打印的位置值给出0,1, 2,3,4,5,6,7,8,9,0,1,2,3。我的代码如下。

提前

thanx

public class ProductListAdapter extends BaseAdapter  implements OnClickListener{    

/*
 * developer :sanu
 * date :10-4-2013
 * time :3.34 pm
 */
public View row;
private String[] productName;
private String[] producttype;
private String[] priceRangeFrom;
private String[] priceRangeTo;
private String[] productImage;
private Activity activity;
private static LayoutInflater inflater=null;
static String posClicked;
ViewHolder holder;
Integer height1;
Integer width1;
Typeface tf;
Integer FirmaCount;
public ImageLoader imageLoader; 
public ProductListAdapter(Activity a,String[] name,String[] type,String[] price_from,String[] price_to,String[] image,Typeface tf) {
    activity    =  a;
    productName = name;
    producttype = type;
    priceRangeFrom = price_from;
    priceRangeTo = price_to;
    productImage = image;       
    inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
    imageLoader=new ImageLoader(activity.getApplicationContext());
}
public int getCount() {
    return productName.length;
}
public Object getItem(int position) {
    return position;
}
public long getItemId(int position) {
    return position;
} 
public int getViewTypeCount (int position)
{
    return position;
}
public static class ViewHolder{
    public TextView nameProduct;
    public TextView typeProduct;
    public TextView priceRangeProduct;
    public ImageView productImage;
    public ImageView plusImage;
    public RelativeLayout mainLayout;
    public int position;  
}
public View getView(int position, View convertView, ViewGroup parent) {     
    if(convertView == null){            
        convertView = inflater.inflate(R.layout.product_list_details,parent, false);
        holder=new ViewHolder();
        holder.nameProduct =(TextView)convertView.findViewById(R.id.name);
        holder.typeProduct =(TextView)convertView.findViewById(R.id.product);
        holder.priceRangeProduct =(TextView)convertView.findViewById(R.id.pricerange);
        holder.productImage =(ImageView)convertView.findViewById(R.id.image);
        holder.plusImage =(ImageView)convertView.findViewById(R.id.dot);
        holder.mainLayout = (RelativeLayout)convertView.findViewById(R.id.mainlayout);
        holder.nameProduct.setText(productName[position]);      
        if(producttype[position].length()>18)
        {
            holder.typeProduct.setText(producttype[position].substring(0,18)+"...");
        }
        else
        {
            holder.typeProduct.setText(producttype[position]);
        }
        holder.priceRangeProduct.setText(priceRangeFrom[position].substring(0,priceRangeFrom[position].length()-2)+" To "+priceRangeTo[position].substring(0, priceRangeTo[position].length()-2));          
        imageLoader.DisplayImage(productImage[position], holder.productImage);
        convertView.setTag(holder);                     
    }
    else
    {           
        holder = (ViewHolder)convertView.getTag();

    }       
    holder.plusImage.setTag(Integer.toString(position));
    holder.plusImage.setOnClickListener(this);  
    holder.mainLayout.setTag(Integer.toString(position));
    holder.mainLayout.setOnClickListener(this); 
    return convertView;
} 

4 个答案:

答案 0 :(得分:6)

这听起来像是View重新循环的情况。 Android会将预先填充的视图传递给getView方法。它这样做是为了最小化对象创建。当现有的行视图在屏幕上滚动时,Android可能会尝试回收该视图以显示现在在屏幕上的行。您需要考虑这个视图可能已用于显示另一行(现在已关闭屏幕)的数据这一事实。

您有以下一行

holder.typeProduct.setText

在以下条件中:

if(convertView == null){            

将该行移出条件之外,一切都应该很好。

答案 1 :(得分:3)

就像EJK说的那样。您没有正确回收视图。将您的代码更改为此并注意我放置setText调用的位置

public View getView(int position, View convertView, ViewGroup parent) {     
if(convertView == null){            
    convertView = inflater.inflate(R.layout.product_list_details,parent, false);
    holder=new ViewHolder();
    holder.nameProduct =(TextView)convertView.findViewById(R.id.name);
    holder.typeProduct =(TextView)convertView.findViewById(R.id.product);
    holder.priceRangeProduct =(TextView)convertView.findViewById(R.id.pricerange);
    holder.productImage =(ImageView)convertView.findViewById(R.id.image);
    holder.plusImage =(ImageView)convertView.findViewById(R.id.dot);
    holder.mainLayout = (RelativeLayout)convertView.findViewById(R.id.mainlayout);

    convertView.setTag(holder);                     
}
else
{           
    holder = (ViewHolder)convertView.getTag();

}       
    holder.plusImage.setTag(Integer.toString(position));
    holder.plusImage.setOnClickListener(this);  
    holder.mainLayout.setTag(Integer.toString(position));
    holder.mainLayout.setOnClickListener(this); 

    //setText functions are here
    holder.nameProduct.setText(productName[position]); 


    if(producttype[position].length()>18)
    {
        holder.typeProduct.setText(producttype[position].substring(0,18)+"...");
    }
    else
    {
        holder.typeProduct.setText(producttype[position]);
    }
    holder.priceRangeProduct.setText(priceRangeFrom[position].substring(0,priceRangeFrom[position].length()-2)+" To "+priceRangeTo[position].substring(0, priceRangeTo[position].length()-2));

    imageLoader.DisplayImage(productImage[position], holder.productImage);

    return convertView;
} 

答案 2 :(得分:1)

getView更改为

public View getView(int position, View convertView, ViewGroup parent) {     
    if(convertView == null){            
        convertView = inflater.inflate(R.layout.product_list_details,parent, false);
        holder=new ViewHolder();
        holder.nameProduct =(TextView)convertView.findViewById(R.id.name);
        holder.typeProduct =(TextView)convertView.findViewById(R.id.product);
        holder.priceRangeProduct =(TextView)convertView.findViewById(R.id.pricerange);
        holder.productImage =(ImageView)convertView.findViewById(R.id.image);
        holder.plusImage =(ImageView)convertView.findViewById(R.id.dot);
        holder.mainLayout = (RelativeLayout)convertView.findViewById(R.id.mainlayout);
        convertView.setTag(holder); 
        } else { 
         holder = (ViewHolder) convertView.getTag();
        } 
        holder.nameProduct.setText(productName[position]);      
        if(producttype[position].length()>18)
        {
            holder.typeProduct.setText(producttype[position].substring(0,18)+"...");
        }
        else
        {
            holder.typeProduct.setText(producttype[position]);
        }
        holder.priceRangeProduct.setText(priceRangeFrom[position].substring(0,priceRangeFrom[position].length()-2)+" To "+priceRangeTo[position].substring(0, priceRangeTo[position].length()-2));          
        imageLoader.DisplayImage(productImage[position], holder.productImage);

       holder.plusImage.setTag(Integer.toString(position));
       holder.plusImage.setOnClickListener(this);  
       holder.mainLayout.setTag(Integer.toString(position));
       holder.mainLayout.setOnClickListener(this); 
       return convertView;
} 

同时检查此

How ListView's recycling mechanism works

答案 3 :(得分:1)

更改getView()

ViewHolder

之前声明if (convertView == null)
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.product_list_details,
                    parent, false);
            holder = new ViewHolder();
            holder.nameProduct = (TextView) convertView.findViewById(R.id.name);
            holder.typeProduct = (TextView) convertView
                    .findViewById(R.id.product);
            holder.priceRangeProduct = (TextView) convertView
                    .findViewById(R.id.pricerange);
            holder.productImage = (ImageView) convertView
                    .findViewById(R.id.image);
            holder.plusImage = (ImageView) convertView.findViewById(R.id.dot);
            holder.mainLayout = (RelativeLayout) convertView
                    .findViewById(R.id.mainlayout);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();

        }
        holder.nameProduct.setText(productName[position]);
        if (producttype[position].length() > 18) {
            holder.typeProduct.setText(producttype[position].substring(0, 18)
                    + "...");
        } else {
            holder.typeProduct.setText(producttype[position]);
        }
        holder.priceRangeProduct.setText(priceRangeFrom[position].substring(0,
                priceRangeFrom[position].length() - 2)
                + " To "
                + priceRangeTo[position].substring(0,
                        priceRangeTo[position].length() - 2));
        imageLoader.DisplayImage(productImage[position], holder.productImage);
        holder.plusImage.setTag(Integer.toString(position));
        holder.plusImage.setOnClickListener(this);
        holder.mainLayout.setTag(Integer.toString(position));
        holder.mainLayout.setOnClickListener(this);
        return convertView;
    }