2011-04-08 76 views
0

我已经为一个ListView行定义为:无法使一个项目的ImageView的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); 
} 

但它不改变可见性。有人可以帮助我吗?

回答

2

也许正在发生的事情是,你不这样做,在正确的方法。

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

无论如何,隐藏图像不应该这样做。也许你应该使用一个空的图像或重写getView方法(在适配器中)。

更新 - 为什么我说你shoudn't使用此方法,这样做

事情是adapter.getView用于获取将被绘制的示意图。 OS需要在屏幕上绘制该项目时调用此方法。

此方法可能被开发人员重写以绘制自定义/复杂视图,但应该仅由系统使用(如在,调用)。例如,当我们谈论长列表时,如果您滚动,您将调用getView方法,并且它将接收一个要重用的视图(效率更高)。这意味着如果你的核心是第一个视图是不可见的,那么当你滚动并且第一个视图被重用以显示第20个项目时(例如),现在第20个项目将是不可见的,因为可能你只是更新标签和图像源。

注:

当我说第一种观点,我指的是其中第一个项目最初得出的观点。之后,用于容纳第一个项目的视图将被重新用于容纳另一个项目。

正在发生的事情:

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

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

后来,你自己打电话getView。如果您传递的视图没有被重用,该方法将创建另一个视图并将其返回。这次有什么不同?您不会将此视图添加到列表视图。 (另外,这不是你要做什么。)

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

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

下面是对谷歌的第一个结果的链接: http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/

+0

我试着改变方向...仍然不会隐形,你确定“隐藏图像不应该这样做吗?”我不明白为什么。 – rajath 2011-04-08 12:19:17

+0

我不知道为什么不知道为什么你不应该使用setVisibility。 – 2011-04-08 13:03:06

+0

佩德罗,我完全理解为什么要使用getView。谢谢你的全面解释。但你也说“或使用透明图像” - 我看到的问题是我无法改变onResume()中的任何内容,为什么会发生这个特殊问题? – rajath 2011-04-08 16:36:54

0

解决方法可能是?

试着做一个透明图像(PNG),并提出,在作为第一项:-)

+0

如果我不能解决问题,我可能会与此一起。 – rajath 2011-04-08 11:56:26

+0

我认为它更清洁,然后把一些东西放在'onResume()',但只有我的意见:-) – 2011-04-08 11:58:36

+0

在这种情况下,您可以将图像设置为null(或来自XML,@ null) 。 – 2011-04-08 11:59:25

2

如何重写getView,然后做setVisibility当您在getView返回第一行()?

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

相关问题