2011-04-08 49 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返回第一行()?

修改列表適配器之外的行並不是一個好主意。由於每次用戶滾動,您都將失去更改。