使用“if (convertView == null)”时,GridView和图标混乱

4

我在这个领域是新手,所以请耐心一些 :)

我正在使用一些LayoutInflater来设置带有图标和下方文本的GridView。当我像下面这样使用时,一切都很好。但是当我去掉注释符“//”时,一切混乱了。图标的顺序错乱了,它们甚至在某些地方重复出现。

    View v;
//    if (convertView == null) {  // if it's not recycled, initialize some attributes
        LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = li.inflate(R.layout.icon, null);
        TextView tv = (TextView)v.findViewById(R.id.icon_text);
        tv.setText(kraj[position]);
        ImageView iv = (ImageView)v.findViewById(R.id.icon_image);
        iv.setImageResource(mThumbIds[position]);
        iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
        iv.setLayoutParams(new LinearLayout.LayoutParams(mniejszy, mniejszy));
//    } else {
    //    v = (View) convertView;
//    }
    return v;

这是我从中得到部分代码的教程: http://developer.android.com/guide/topics/ui/layout/gridview.html
2个回答

2

这是因为你只在convertViewnull时设置图像(例如,当GridView首次显示在屏幕上时),而当GridView滚动时(convertView不会为null),它将回收行视图,因此你最终会得到旧的行,其中没有用新图像/文本进行更新。你的代码应该像这样:

View v;
    if (convertView == null) {  // if it's not recycled, initialize some attributes
        LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = li.inflate(R.layout.icon, null);            
    } else {
       v = (View) convertView;
    }
    TextView tv = (TextView)v.findViewById(R.id.icon_text);
    tv.setText(kraj[position]);
    ImageView iv = (ImageView)v.findViewById(R.id.icon_image);
    iv.setImageResource(mThumbIds[position]);
    iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
    iv.setLayoutParams(new LinearLayout.LayoutParams(mniejszy, mniejszy));
    return v;

好的,那么这个“if”语句是干什么用的呢?如果不检查convertView==0也能正常工作的话? - Lukis
“if”是一种性能优化,因为如果视图已经初始化,为什么要重新填充它呢?在小列表上可能不会注意到它,但在大列表上不浪费资源可以帮助很多。 - A--C
很有道理!谢谢你的帮助。如果我获得更多的声望,我会投票支持你 :) - Lukis

1
你所遇到的问题可能是由于回收视图中有之前分配的数据。请查看以下代码以获取指导方向。
View v;
if(convertView == null) {
  LayoutInflater li = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = li.inflate(R.layout.icon, null);
} else {
 v = (View) convertView; 
}

// now override whatever `recycled view` has

     TextView tv = (TextView)v.findViewById(R.id.icon_text);
        tv.setText(kraj[position]);
        ImageView iv = (ImageView)v.findViewById(R.id.icon_image);
        iv.setImageResource(mThumbIds[position]);
        iv.setScaleType(ImageView.ScaleType.CENTER_CROP);
        iv.setLayoutParams(new LinearLayout.LayoutParams(mniejszy, mniejszy));

return v;

这正是问题所在!谢谢! 我不能给你点赞,因为我的声望不到15分,但非常感谢! - Lukis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接