我有一个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
,但我不会这样做...
提前致谢。
答案 0 :(得分:1)
我不确定这是否算你的答案。问题的根源似乎是我们正在使用的convertView。我没有深入研究Android源代码,但我认为无法保证视图的重用方式,即使很明显所有视图都已经可见,并且幕后不应该重复使用。
这意味着,当我们可视化整个场景时,我们链接到位置7的视图实际上会在稍后的位置0重用。由于您的代码未明确重置视图以使其可见,因此视图将在可见性集中重复使用无形,因此消失的第一个项目的奥秘。
最简单的解决方案应该像@Vinay上面建议的那样,明确地设置为View.VISIBLE。
if ((position == ADDITIONAL_ICON))) {
if (!showAdditionalIcon)
v.setVisibility(View.INVISIBLE);
else
v.setVisibility(View.VISIBLE);
}
希望这会有所帮助,但我真的希望有一些Android专家来告诉我们更多关于重用旧视图的整个过程是如何工作的。