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

时间:2011-04-08 11:49:13

标签: 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
        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>

我的ListView适配器在onCreate()

中设置
    listView.setAdapter(new ArrayAdapter<String>(this, R.layout.send_menu_row, R.id.menutext, items));

我有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);
}

但它并没有改变可见度。有人可以帮我吗?

3 个答案:

答案 0 :(得分:2)

可能发生的事情是你没有用正确的方法做到这一点。

尝试将设备方向从水平切换到垂直(反之亦然)。这应该触发onResume方法调用,可以工作。

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

更新 - 为什么我说你不应该使用这种方法来做到这一点

事物是adapter.getView用于获取将被绘制的视图。操作系统在需要在屏幕上绘制该项时调用此方法。

开发人员可以覆盖此方法来绘制自定义/复杂视图,但应该由系统独占使用(如,调用)。

例如,当我们讨论长列表时,如果你滚动,你将调用getView方法,它将接收一个可以重用的视图(效率更高)。这意味着如果你硬核第一个视图将是不可见的,当你滚动并重新使用第一个视图来显示第20个项目时(例如),现在第20个项目将是不可见的,因为可能你只是更新标签和图像源。

注意:

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

发生了什么:

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

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

后来,您可以自己致电getView。当您没有传递任何视图以供重用时,该方法将创建另一个视图并将其返回。这次有什么不同?您没有将此视图添加到列表视图。 (此外,这不是你要做什么。)

您要做的是获取用于绘制第一个项目的 的视图。但在这种情况下,您只是获得另一个视图,可用于绘制第一个项目。

解决方案是覆盖getView或使用透明图像(更简单)。

以下是Google上第一个结果的链接: http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/

答案 1 :(得分:2)

如何在getView()中返回第一行时覆盖getView然后执行setVisibility?

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

答案 2 :(得分:0)

可能有解决方法吗?

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