Android 无法使ListView中一个项目的ImageView不可见
我为ListView定义了一行,如下所示: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
<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);
}