首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置对以前在GridView中不可见的元素可见

设置对以前在GridView中不可见的元素可见
EN

Stack Overflow用户
提问于 2011-11-11 20:12:03
回答 1查看 4.3K关注 0票数 3

我有一个GridView,我想在其中始终显示7个图标,有时根据请求显示一个额外的图标。在开始时,不会显示额外的图标。结构是这样的:

代码语言:javascript
复制
0   1   2
3   4   5
6  [7]

所有的图标都适合屏幕,所以我不需要/不需要滚动。每个图标由一个图像和一个文本组成。

为此,我有一个扩展BaseAdapter的CustomAdapter。我重写了为每个图标设置文本和图像的getView方法。

代码语言:javascript
复制
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中的其他函数和变量包括:

代码语言:javascript
复制
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:

代码语言:javascript
复制
    GridView grid = (GridView) findViewById(R.id.main_gridView);
    customAdapter = new CustomAdapter(this);
    grid.setAdapter(customAdapter);

我的问题出现在一些计算和对服务器的请求之后,我必须显示额外的图标(数字7)。所以我(从ClassA)调用:

代码语言:javascript
复制
    customAdapter.showAdditionalIcon();

现在,其他图标出现,但第一个图标消失...我曾尝试使用notifyDataSetInvalidated()notifyDataSetChanged(),但两者的结果相同。

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

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2011-11-12 02:13:33

我不确定这对你来说算不算答案。问题的根源似乎是我们正在使用的convertView。我没有深入研究Android源代码,但我认为即使所有视图都是可见的,并且不应该在幕后重用,也不能保证视图如何被重用。

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

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

代码语言:javascript
复制
if ((position == ADDITIONAL_ICON))) {
    if (!showAdditionalIcon)
        v.setVisibility(View.INVISIBLE);
    else
        v.setVisibility(View.VISIBLE);
}

希望这能有所帮助,但我真的希望一些Android专家来告诉我们更多关于重用旧视图的事情是如何实际工作的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8093815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档