Android Listview:在BaseAdapter:getView中动态添加图像会导致图像重复

Android Listview:在BaseAdapter:getView中动态添加图像会导致图像重复,android,listview,android-listview,Android,Listview,Android Listview,我正在listview适配器类中扩展BaseAdapter类。在这个类中,我在每一行中动态添加图像。但由于某种原因,我在一行中得到了重复的图像数 我尝试在getView中动态添加图像时进行日志记录,但getView似乎被调用了两次。我怎样才能解决这个问题 以下是片段: public View getView(int position, View convertView, ViewGroup parent) { View vi = convertView; if(c

我正在listview适配器类中扩展BaseAdapter类。在这个类中,我在每一行中动态添加图像。但由于某种原因,我在一行中得到了重复的图像数

我尝试在getView中动态添加图像时进行日志记录,但getView似乎被调用了两次。我怎样才能解决这个问题

以下是片段:

public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if(convertView == null){
            vi = inflater.inflate(R.layout.myrowlayout, null);
        }

        HorizontalScrollView horizontalScrollView = (HorizontalScrollView)vi.findViewById(R.id.horizontallayout);
        LinearLayout imagesLayout = (LinearLayout)vi.findViewById(R.id.linearlayoutinsidehorizontal);


        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(...);
        //...
        LinearLayout.LayoutParams ilp = new LinearLayout.LayoutParams(...);
        //...

        RowData current = new RowData();
        current = data.get(position);

        if(current.hasImage()){
            //...
            ArrayList<String> images = current.getImages();
            for(int i = 0; i < images.size(); i++){
                ImageView currImage = new ImageView(mActivity);
                currImage.setLayoutParams(ilp);
                imagesLayout.addView(currImage);
                imageLoader.DisplayImage(images.get(i), currImage);
                //imageLoader is an implementation of [LazyList] see note below
                Log.d("PostListAdapter:getView", "image[" + i + "]: " + images.get(i));
            }
            horizontalScrollView.removeAllViews();
            horizontalScrollView.addView(imagesLayout);
        }

        return vi;
    }
注:


我已使用加载所有图像。

在设置适配器时,使用视图保持架并按说明设置标记。

这里是一个摘录,请注意,您还在每个视图的绘制调用中保存对findViewById的所有调用

public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    CustomHolder dataHolder = null;
    if(convertView == null){
        vi = inflater.inflate(R.layout.myrowlayout, null);
        HorizontalScrollView horizontalScrollView = (HorizontalScrollView)vi.findViewById(R.id.horizontallayout);
        LinearLayout imagesLayout = (LinearLayout)vi.findViewById(R.id.linearlayoutinsidehorizontal);
        dataHolder = new CustomHolder(horizontalScrollView, imagesLayout);
        vi.setTag(dataHolder);
    } else {
        dataHolder = vi.getTag();
    }

    //... Do whatever with the views

    return vi;
}
// Custom Holder class
private class CustomHolder{
    HorizontalScrollView horizontalScrollView;
    LinearLayout imagesLayout;

    CustomHolder(HorizontalScrollView hsv, LinearLayout imgLayout){
        this.horizontalScrollView = hsv;
        this.imagesLayout = imgLayout;
    }
}

getView
call与传递到类中的列表计数相关,若要调用static number,必须将其设置为getCountThank中的return语句。这就是我需要的。
public View getView(int position, View convertView, ViewGroup parent) {
    View vi = convertView;
    CustomHolder dataHolder = null;
    if(convertView == null){
        vi = inflater.inflate(R.layout.myrowlayout, null);
        HorizontalScrollView horizontalScrollView = (HorizontalScrollView)vi.findViewById(R.id.horizontallayout);
        LinearLayout imagesLayout = (LinearLayout)vi.findViewById(R.id.linearlayoutinsidehorizontal);
        dataHolder = new CustomHolder(horizontalScrollView, imagesLayout);
        vi.setTag(dataHolder);
    } else {
        dataHolder = vi.getTag();
    }

    //... Do whatever with the views

    return vi;
}
// Custom Holder class
private class CustomHolder{
    HorizontalScrollView horizontalScrollView;
    LinearLayout imagesLayout;

    CustomHolder(HorizontalScrollView hsv, LinearLayout imgLayout){
        this.horizontalScrollView = hsv;
        this.imagesLayout = imgLayout;
    }
}