Android Listview在滚动时获取重复元素

时间:2014-02-17 08:18:30

标签: android listview android-listview

我在android应用程序中使用listview。 我必须从网上下载不同的图像,并将它们添加到每个列表元素下。 图像下载,保存到SD卡以供将来参考和显示正在按预期工作。

但是当我尝试滚动列表时,前几个元素的一些图像被复制或移动到最后一个元素。

这是一种非常奇怪的行为,直到现在我都没有这种行为。

如果有人遇到同样的问题,请帮助我。

提前致谢。

3 个答案:

答案 0 :(得分:1)

确保在ListView适配器上实现回收。以下是具有回收功能的Listview适配器示例:

public class NewsAdapter extends ArrayAdapter<NewsDto> {
    private final Context context;
    ArrayList<NewsDto> nList;

    public NewsAdapter(Context context, ArrayList<NewsDto> nList) {
        super(context, R.layout.fragment_news_item, nList);
        this.context = context;
        this nList = nList;
        // TODO Auto-generated constructor stub
    }

    public class ViewHolder {
        TextView description;
        ImageView image1

    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        final ViewHolder holder;
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (view == null) {
            view = inflater.inflate(R.layout.fragment_news_item, parent, false);
            holder = new ViewHolder();
            holder.description = (TextView) view
                    .findViewById(R.id.news_description);
            holder.image1 = (ImageView) view.findViewById(R.id.news_image1);
            view.setTag(holder);
        } else {
            holder = (ViewHolder) view.getTag();
        }
    // get a single data from your list.
    NewsDto newsDto= nlist.get(position);

    //initialization of Image
    holder.image1.setImageBitmap(newsDto.getImage());

        return view;

    }

}

滚动时,它使用类来保存列表视图中每个项目的标记。因此,当您向后滚动到已初始化的特定项目时,您的初始化将被回收。

答案 1 :(得分:0)

使用ViewHolder模式并考虑到Android回收视图,您的适配器getView看起来像这样(更多伪代码):

public View getView(ViewGroup parent, View convertView, int position) {
    ViewHolder holder = null;
    if(convertView == null) {
        convertView = inflater.inflate(...);
        holder = new ViewHolder();
        // initialize view holder views from inflated convertView
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder)convertView.getTag();
    }
    // update each ViewHolder's View with relevant information
    return convertView;
}

有关此机制如何运作的详细信息,请查看此热门Google IO presentation(自2010年开始)

答案 2 :(得分:0)

convertView = null方法的开头设置getView()。即。

 @Override
public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder = new ViewHolder();
    convertView = null;

    if (convertView == null) {
               // your code
            }else{
               holder = (ViewHolder) convertView.getTag();
            }

            // your code
      }

这将停止回收ListView元素。当我加载太多项目并滚动ListView时,它对我有用。