我是这个领域的新手,所以请耐心等待:)。
我正在使用一些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
答案 0 :(得分:2)
这种情况正在发生,因为您在convertView
为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;
答案 1 :(得分: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;