我有一个GridView,我想在其中始终显示7个图标,有时根据请求显示一个额外的图标。在开始时,不会显示额外的图标。结构是这样的:
0 1 2
3 4 5
6 [7]所有的图标都适合屏幕,所以我不需要/不需要滚动。每个图标由一个图像和一个文本组成。
为此,我有一个扩展BaseAdapter的CustomAdapter。我重写了为每个图标设置文本和图像的getView方法。
public View getView(int position, View convertView, ViewGroup parent) {
View v = null;
if (convertView == null) {
LayoutInflater li = ((Activity) context).getLayoutInflater();
v = li.inflate(R.layout.icon, null);
} else {
v = convertView;
}
TextView tv = (TextView) v.findViewById(R.id.icon_textView);
tv.setText(position);
ImageView iv = (ImageView) v.findViewById(R.id.icon_ImageView);
iv.setImageResource(imageResourcesArray[position]);
if ((position == ADDITIONAL_ICON)) && !showAdditionalIcon) {
v.setVisibility(View.INVISIBLE);
}
return v;
}imageResourcesArray[]是包含图像资源的整数数组。CustomAdapter中的其他函数和变量包括:
public static final int ADDITIONAL_ICON = 7;
private boolean showAdditionalIcon = false;
public showAdditionalIcon(){
this.showAdditionalIcon = true;
notifyDataSetChanged();
// notifyDataSetInvalidated();
}
public hideAdditionalIcon(){
this.showAdditionalIcon = false;
notifyDataSetChanged();
// notifyDataSetInvalidated();
}稍后,我从一个扩展Activity的类(比如ClassA)创建CustomAdapter并将其设置为GridView:
GridView grid = (GridView) findViewById(R.id.main_gridView);
customAdapter = new CustomAdapter(this);
grid.setAdapter(customAdapter);我的问题出现在一些计算和对服务器的请求之后,我必须显示额外的图标(数字7)。所以我(从ClassA)调用:
customAdapter.showAdditionalIcon();现在,其他图标出现,但第一个图标消失...我曾尝试使用notifyDataSetInvalidated()和notifyDataSetChanged(),但两者的结果相同。
当然,我可以生成一个允许附加图标的新CustomAdapter,但我不希望这样做……
提前谢谢。
发布于 2011-11-12 02:13:33
我不确定这对你来说算不算答案。问题的根源似乎是我们正在使用的convertView。我没有深入研究Android源代码,但我认为即使所有视图都是可见的,并且不应该在幕后重用,也不能保证视图如何被重用。
这意味着,当我们可视化整个场景时,我们链接到位置7的视图实际上稍后在位置0处被重用。由于您的代码没有显式地将视图重置为可见,因此该视图将被重用,并将可见性设置为不可见,从而解释了第一项消失的奥秘。
最简单的解决方案应该是像上面的@Vinay建议的那样,显式地设置为View.VISIBLE。
if ((position == ADDITIONAL_ICON))) {
if (!showAdditionalIcon)
v.setVisibility(View.INVISIBLE);
else
v.setVisibility(View.VISIBLE);
}希望这能有所帮助,但我真的希望一些Android专家来告诉我们更多关于重用旧视图的事情是如何实际工作的。
https://stackoverflow.com/questions/8093815
复制相似问题