3

我有一个 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 的类(例如)创建 CustomAdapter 并将其设置为 GridView ClassA

    GridView grid = (GridView) findViewById(R.id.main_gridView);
    customAdapter = new CustomAdapter(this);
    grid.setAdapter(customAdapter);

在对服务器进行一些计算和请求后,我的问题出现了,我必须显示附加图标(数字 7)。所以我打电话(来自ClassA):

    customAdapter.showAdditionalIcon();

现在,出现了附加图标,但第一个图标消失了......我尝试使用notifyDataSetInvalidated()notifyDataSetChanged()但两者都有相同的结果。

当然,我可以生成一个CustomAdapter允许附加图标的新图标,但我不希望这样做......

提前致谢。

4

1 回答 1

1

我不确定这是否算作你的答案。问题的根源似乎是我们正在使用的 convertView。我没有深入研究 Android 源代码,但我认为无法保证如何重用视图,即使很明显所有视图都已经可见并且不应该在幕后重用。

这意味着我们在可视化整个场景时链接到位置 7 的视图实际上稍后在位置 0 处被重用。由于您的代码没有显式地将视图重置为可见,视图将在可见性设置为 INVISIBLE 的情况下被重用,因此,消失的第一个项目的奥秘。

最简单的解决方案应该像上面@Vinay 建议的那样,通过显式设置为 View.VISIBLE。

if ((position == ADDITIONAL_ICON))) {
    if (!showAdditionalIcon)
        v.setVisibility(View.INVISIBLE);
    else
        v.setVisibility(View.VISIBLE);
}

希望这会有所帮助,但我真的希望一些 Android 专家突然出现,告诉我们更多关于重用旧视图的整个事情实际上是如何工作的。

于 2011-11-11T18:13:32.697 回答