【问题标题】:Setting visible to elements that were invisible before in GridView将之前在 GridView 中不可见的元素设置为可见
【发布时间】:2011-11-11 12:12:03
【问题描述】:

我有一个 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 并允许附加图标,但我不希望这样做...

提前致谢。

【问题讨论】:

  • v.setVisibility(View.INVISIBLE);而不是这个尝试 v.setVisibility(View.GONE);其次,当你需要展示它时 view.setVisibility(View.VISIBLE);
  • 但如果我按照您的建议执行此操作,我应该将图标 7 的视图保存在一个变量中,不是吗?现在,我不保存任何视图,因此 BaseAdapter 应该知道何时更新/重新生成所有图标。
  • 我终于按照你的建议做了。我删除了 notifyDataSetInvalidated() 和 notifyDataSetChanged() 调用,效果很好。谢谢!
  • 请检查我的回答,它会有所帮助。 [1]:stackoverflow.com/questions/8933776/…

标签: android gridview baseadapter


【解决方案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 专家突然出现,告诉我们更多关于重用旧视图的整个事情实际上是如何工作的。

【讨论】:

  • 是的,感谢两位的解决方案。我意识到我不需要调用 notifyDataSetInvalidated() 或 notifyDataSetChanged() 因为我没有更改任何内容,只是显示它。取而代之的是,我只是将图标 7 的视图保存在一个变量中,当我需要显示它时,我只需按照你们的建议进行操作。
猜你喜欢
  • 2013-07-06
  • 2023-03-16
  • 2018-12-25
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多