将设置显示为GridView之前不可见的元素

时间:2011-11-11 12:12:03

标签: android gridview baseadapter

我有一个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,但我不会这样做...

提前致谢。

1 个答案:

答案 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专家来告诉我们更多关于重用旧视图的整个过程是如何工作的。