1

例如,我一直在关注许多关于如何优化诸如画廊之类的列表的教程,但我无法让我的适配器重新循环视图。这是我的代码:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Log.d("ImageAdapter","getView : "+convertView);
    ImageView imageView = null;

    if (convertView == null){
        //imageView = (ImageView) mInflater.inflate(R.layout.pic_adapter, null);
        imageView = new ImageView(context);


        holder = new ViewHolder();
        holder.imageView = imageView;

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

    holder.imageView.setImageDrawable(plotsImages.get(position));
    Log.d("ImageAdapter","return : "+imageView);
    return imageView;
}

在我的日志中,我在 getView 的开头一直得到“null”,这意味着 convertView 不是一些重新循环的视图,那是怎么回事?

谢谢你的帮助!

4

2 回答 2

1

我相信您在 ViewHolder 中使用的循环逻辑是罪魁祸首。当我尝试运行您的代码时,应用程序因一个晦涩的错误而崩溃。但是,这很好用:

public View getView(int position, View convertView, ViewGroup parent) {
    Log.d("ImageAdapter","getView : "+convertView);
    ImageView imageView = null;

    if (convertView == null){
        //imageView = (ImageView) mInflater.inflate(R.layout.pic_adapter, null);
        imageView = new ImageView(Example.this);
    } else {
        imageView = (ImageView) convertView;
    }

    imageView.setImageDrawable(plotsImages.get(position));
    Log.d("ImageAdapter","return : "+imageView);
    return imageView;
}

ViewHolders 应该可以避免您findViewById()重复使用来访问行布局中的子视图。由于您的布局只是一个 ImageView,因此不需要 ViewHolder。

于 2012-10-30T19:48:31.903 回答
0

首先摆脱持有人,你在convertView中得到的就是你从getView()返回的。这也是您对代码的期望,那么为什么会有这种不必要的复杂性呢?

您使用的是什么适配器类?您可以尝试使用 BaseAdapter 并确保所有被覆盖的方法都返回适当的数据吗?

我在考虑getItemViewType,如果每次返回不同的值,回收将被禁用。

于 2013-03-21T08:48:50.380 回答