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

4

2 回答 2

2

发生这种情况是因为您convertViewis时设置图像null(例如,当GridView屏幕上首次显示时会发生这种情况),并且当GridView滚动时(convertView不会为空),它将回收行视图,因此您最终会得到您未使用新图像/文本更新的旧行。你的代码应该是这样的:

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;
于 2012-12-31T15:54:45.010 回答
1

您所经历的可能是由于recycled view您之前分配的数据。

请查看以下代码以获取方向。

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;
于 2012-12-31T15:57:02.343 回答