9

baseadapter を使用してカスタム リスト ビューを作成しています。リストに 10 個のリスト アイテムがあります。問題は、6 個のアイテムの後、最初の 4 個が繰り返されていることです。getview で位置の値を印刷しただけです。 ,4,5,6,7,8,9,0,1,2,3.私のコードは以下です。

事前に感謝

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

4 に答える 4

6

これは、View の再利用のケースのように思えます。Android は、事前入力されたビューを getView メソッドに渡します。これは、オブジェクトの作成を最小限に抑えるためです。既存の行ビューが画面外にスクロールされると、Android はそのビューをリサイクルして、現在画面上にある行を表示しようとする場合があります。このビューが別の行 (現在は画面外にある) のデータを表示するために使用された可能性があるという事実を考慮する必要があります。

次の行があります

holder.typeProduct.setText

次の条件内:

if(convertView == null){            

その行を条件の外に移動すると、すべてがうまくいくはずです。

于 2013-11-09T06:52:47.227 に答える
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;
    }
于 2013-11-09T07:07:03.990 に答える
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;
} 

こちらもチェック

ListView のリサイクル メカニズムのしくみ

于 2013-11-09T06:53:41.613 に答える