Android 适配器不断实例化适配器视图

Android 适配器不断实例化适配器视图,android,adapter,Android,Adapter,我一直在学习许多教程,学习如何优化这样的列表,例如图库,但我无法让适配器重新循环视图。 这是我的密码: @Override public View getView(int position, View convertView, ViewGroup parent) { Log.d("ImageAdapter","getView : "+convertView); ImageView imageView = null; if (convertView == null){

我一直在学习许多教程,学习如何优化这样的列表,例如图库,但我无法让适配器重新循环视图。 这是我的密码:

@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不是某种重新循环的视图,这是怎么回事


谢谢你的帮助

我相信你在取景器中使用的循环逻辑是罪魁祸首。当我试图运行你的代码时,应用程序因一个模糊的错误而崩溃。但是,这很好:

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;
}

视图持有者应该避免您重复使用
findviewbyd()
访问行布局中的子视图。由于您的布局只是一个图像视图,因此不需要一个视图支架。

我认为您在视图支架中使用的循环逻辑是罪魁祸首。当我试图运行你的代码时,应用程序因一个模糊的错误而崩溃。但是,这很好:

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;
}

视图持有者应该避免您重复使用
findviewbyd()
访问行布局中的子视图。因为您的布局只是一个图像视图,所以不需要视图保持架。

首先去掉保持架,在convertView中得到的是从getView()返回的内容。这也是您在代码中所期望的,那么为什么会有如此不必要的复杂性呢

您使用的适配器类是什么?您能否尝试使用BaseAdapter并确保所有重写的方法都返回适当的数据


我考虑的是getItemViewType,如果它每次返回不同的值,则循环将被禁用。

首先去掉该持有者,在convertView中得到的是从getView()返回的内容。这也是您在代码中所期望的,那么为什么会有如此不必要的复杂性呢

您使用的适配器类是什么?您能否尝试使用BaseAdapter并确保所有重写的方法都返回适当的数据


我考虑的是getItemViewType,如果它每次返回不同的值,则循环将被禁用。

在滚动后是否仍然看到
“getView:null”
?此外,您当前的布局不需要视图保持架。您是否有足够的视图来填充屏幕+?只有当你有足够的空间让某些物体看不见时,它们才会被回收利用(因此可以重复使用)。是的,我有大约13个物体,我的视图足够大,一次可以显示3个。在滚动和滚动之后,我一直得到空值。。。如果你试着用你的电脑,你会得到什么?几次滚动后不再显示null?滚动后是否仍会看到
“getView:null”
?此外,您当前的布局不需要视图保持架。您是否有足够的视图来填充屏幕+?只有当你有足够的空间让某些物体看不见时,它们才会被回收利用(因此可以重复使用)。是的,我有大约13个物体,我的视图足够大,一次可以显示3个。在滚动和滚动之后,我一直得到空值。。。如果你试着用你的电脑,你会得到什么?几次滚动后就没有空值了?我刚刚尝试过这个,第一次日志中不断出现空值:/InstanceImageView时,我使用适配器构造函数中给出的上下文,对吗?
public ImageAdapter(活动上下文,列表绘图页){Log.d(“ImageAdapter”,“CTOR”);this.context=context;this.plotsImages=plotsImages;mInflater=context.getLayoutInflater();}
,我在第一个日志中不断得到null:/当我实例化ImageView时,我使用适配器构造函数中给出的上下文,对吗?
public ImageAdapter(活动上下文,列表绘图页){Log.d(“ImageAdapter”,“CTOR”);this.context=context;this.plotsImages=plotsImages;mInflater=context.getLayoutInflater();}