Android 设置对以前在GridView中不可见的图元可见

Android 设置对以前在GridView中不可见的图元可见,android,gridview,baseadapter,Android,Gridview,Baseadapter,我有一个GridView,其中我希望始终显示7个图标,有时根据请求显示一个附加图标。开始时,不会显示附加图标。结构如下: 0 1 2 3 4 5 6 [7] 所有的图标都适合屏幕,所以我不需要滚动。每个图标由一个图像和一个文本组成 为此,我有一个CustomAdapter,它扩展了BaseAdapter。我已经重写了getView方法,在该方法中,我为每个图标设置了文本和图像 public View getView(int position, View convertView

我有一个GridView,其中我希望始终显示7个图标,有时根据请求显示一个附加图标。开始时,不会显示附加图标。结构如下:

0   1   2
3   4   5
6  [7]
所有的图标都适合屏幕,所以我不需要滚动。每个图标由一个图像和一个文本组成

为此,我有一个CustomAdapter,它扩展了BaseAdapter。我已经重写了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();
}
稍后,我从一个扩展活动的类(比如
ClassA
)创建CustomAdapter并将其设置为GridView:

我的问题出现在计算和请求服务器后,我必须显示附加图标(7号)。所以我调用(从
ClassA
):

现在,额外的图标出现了,但第一个图标消失了。。。我曾尝试使用
notifyDataSetValidated()
notifyDataSetChanged()
但两者的结果相同

当然,我可以生成一个新的
CustomAdapter
,并允许添加额外的图标,但我不想这样做


提前谢谢。

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

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

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

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

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

v.setVisibility(View.INVISIBLE);而不是尝试v.setVisibility(View.GONE);第二,当您需要显示它view.setVisibility(view.VISIBLE)时;但是如果我按照你的建议这样做,我应该将图标7的视图保存在一个变量中,不是吗?现在,我没有保存任何视图,因此BaseAdapter应该知道何时更新/重新生成所有图标。我删除了notifyDataSetionValidated()和notifyDataSetChanged()调用,效果非常好。非常感谢。请检查我的答案,这将是有益的。[1] :是的,谢谢你们两位的解决方案。我意识到我不需要调用NotifyDataSetionValidated()或notifyDataSetChanged(),因为我没有更改任何内容,只是显示了它。相反,我只是将图标7的视图保留在一个变量中,当我需要显示它时,我只是按照你们的建议做。
    customAdapter.showAdditionalIcon();
if ((position == ADDITIONAL_ICON))) {
    if (!showAdditionalIcon)
        v.setVisibility(View.INVISIBLE);
    else
        v.setVisibility(View.VISIBLE);
}