Android 无法使ListView中一个项目的ImageView不可见

Android 无法使ListView中一个项目的ImageView不可见,android,android-listview,Android,Android Listview,我为ListView定义了一行,如下所示: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView

我为ListView定义了一行,如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    <TextView
        android:id="@+id/menutext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textSize="24sp"
        android:layout_alignParentLeft="true"/>
    <ImageView
        android:id="@+id/icon"
        android:layout_width="40dip"
        android:layout_height="40dip"
        android:src="@drawable/lock"
        android:layout_gravity="right"
        android:layout_alignParentRight="true"/>
</LinearLayout>
我有5行,每行有一个文本和图像。在
onResume()
中,我想使第一行的
ImageView
不可见

@Override
protected void onResume()
{
    super.onResume();
    LinearLayout linLayout = (LinearLayout) listView.getAdapter().getView(0, null, null);
    ImageView v = (ImageView) linLayout.getChildAt(1);
    v.setVisibility(View.INVISIBLE);
}
但它不会改变可见性。有人能帮我解决这个问题吗?

也许是一个解决办法

尝试制作一个透明图像(png)并将其作为第一项放入:-)

可能是一个解决方法


尝试制作一个透明图像(png)并将其作为第一项放入:-)

可能发生的情况是,您没有使用正确的方法

尝试将设备方向从水平方向切换到垂直方向(反之亦然)。这将触发要调用的
onResume
方法,并且可以运行

无论如何,隐藏图像不应该这样做。也许您应该使用空映像或覆盖getView方法(在适配器中)

更新-为什么我说你不应该使用此方法来更新

事情是
适配器。getView
用于获取将要绘制的视图。当操作系统需要在屏幕上绘制该项时,会调用此方法

开发人员可以重写此方法以绘制自定义/复杂视图,但系统应专门使用(如中所述,调用)此方法

例如,当我们谈论长列表时,如果您滚动,您将调用
getView
方法,它将收到一个要重用的视图(这要高效得多)。这意味着,如果您确定第一个视图不可见,则当您滚动并重新使用第一个视图以显示第20个项目(例如)时,第20个项目将不可见,因为您可能只需更新标签和图像源

注意:

当我说第一个视图时,我指的是最初绘制第一个项目的视图。稍后,用于容纳第一个项目的视图将被重用以容纳另一个项目

发生了什么:

我想我现在明白了。我认为正在发生的事情如下:

最初绘制活动时,将调用
getView
方法5次(显示的每个项目一次)。每次操作系统收集返回的视图并将其添加到listview时

后者,您将自己调用
getView
。当您没有传递要重用的视图时,该方法将创建另一个视图并返回它。这次有什么不同?您没有将此视图添加到listview。(而且,这不是你应该做的。)

您要做的是获取用于绘制第一项的视图。但在本例中,您只是得到了另一个视图,可以用来绘制第一个项目

解决方案是覆盖
getView
或使用透明图像(更容易)

以下是谷歌第一个搜索结果的链接:
可能发生的情况是,你没有用正确的方法来做这件事

尝试将设备方向从水平方向切换到垂直方向(反之亦然)。这将触发要调用的
onResume
方法,并且可以运行

无论如何,隐藏图像不应该这样做。也许您应该使用空映像或覆盖getView方法(在适配器中)

更新-为什么我说你不应该使用此方法来更新

事情是
适配器。getView
用于获取将要绘制的视图。当操作系统需要在屏幕上绘制该项时,会调用此方法

开发人员可以重写此方法以绘制自定义/复杂视图,但系统应专门使用(如中所述,调用)此方法

例如,当我们谈论长列表时,如果您滚动,您将调用
getView
方法,它将收到一个要重用的视图(这要高效得多)。这意味着,如果您确定第一个视图不可见,则当您滚动并重新使用第一个视图以显示第20个项目(例如)时,第20个项目将不可见,因为您可能只需更新标签和图像源

注意:

当我说第一个视图时,我指的是最初绘制第一个项目的视图。稍后,用于容纳第一个项目的视图将被重用以容纳另一个项目

发生了什么:

我想我现在明白了。我认为正在发生的事情如下:

最初绘制活动时,将调用
getView
方法5次(显示的每个项目一次)。每次操作系统收集返回的视图并将其添加到listview时

后者,您将自己调用
getView
。当您没有传递要重用的视图时,该方法将创建另一个视图并返回它。这次有什么不同?您没有将此视图添加到listview。(而且,这不是你应该做的。)

您要做的是获取用于绘制第一项的视图。但在本例中,您只是得到了另一个视图,可以用来绘制第一个项目

解决方案是覆盖
getView
或使用透明图像(更容易)

以下是谷歌第一个搜索结果的链接:

当返回getView()中的第一行时,覆盖getView,然后执行setVisibility如何


在列表适配器之外修改行不是一个好主意。由于用户每次滚动都会丢失更改。

当返回getView()中的第一行时,覆盖getView,然后执行setVisibility如何


在列表适配器之外修改行不是一个好主意。因为每次用户滚动时,您都会丢失更改。

我认为它会更干净,然后再放入一些内容
@Override
protected void onResume()
{
    super.onResume();
    LinearLayout linLayout = (LinearLayout) listView.getAdapter().getView(0, null, null);
    ImageView v = (ImageView) linLayout.getChildAt(1);
    v.setVisibility(View.INVISIBLE);
}