2011-09-22 69 views
0

假設一個列表有4個項目,我如何從列表中的每個菜單項按位置獲取視圖?如何從列表視圖中按位置獲取每個菜單項?

+1

你說的列表視圖中提到類似的問題,但隨後詢問如何從每個「菜單」視圖。你在談論一個上下文菜單或列表視圖? – Jack

+0

是的,目前尚不清楚你的問題是什麼。更好的解釋會導致更好的答案。 –

+0

確定一個「列表視圖」 – wickerman87

回答

1

不幸的是,ListView中的項目通常只有那些可見的項目。您應該在ListAdapter上迭代。

例如,在我的一些代碼,我有這樣的:

SimpleCursorAdapter adapter = (SimpleCursorAdapter) this.getListAdapter(); 
    int iNum = adapter.getCount(); 
    for(int i=0; i<iNum; i++) 
    { 
     Cursor c = (Cursor) adapter.getItem(i); 

     // Now you can pull data from the cursor object, 
     // if that's what you used to create the adapter to start with 
    } 

編輯: 針對jeffamaphone的意見,這裏是別的東西......如果你試圖用每個UI工作元素,然後getChildAt當然更合適,因爲它返回子項目的視圖,但總的來說,你仍然只能使用當時可見的那些。如果這就是你所關心的,那麼很好 - 只要確保你在電話回覆時檢查null

如果您正在嘗試實現類似於我的功能 - 對於可能超出屏幕的列表,「全選/無選擇/反轉選擇」功能的類型,那麼您最好在適配器,或者有一個外部陣列(如果在我的情況下,在適配器中沒有任何地方可以創建chagne),然後在列表適配器上調用notifyDataSetChanged()。例如,我的「反轉」功能有這樣的代碼:

case R.id.selectInvertLedgerItems: 
     for(int i=0; i<ItemChecked.length; i++) 
     { 
      ItemChecked[i] = !ItemChecked[i]; 
     } 
     la.notifyDataSetChanged(); 
     RecalculateTotalSelected(); 
     break; 

注意,在我的情況,我還使用自定義的ListView子項,使用adapter.setViewBinder(this);和一個自定義功能setViewValue(...)

此外如果我記得正確,我不認爲列表中的「位置」必須與適配器中的「位置」相同......它再次基於位置在名單。因此,即使您想要列表中的「第50個」項目,如果它是第一個可見的,getChildAt(50)也不會返回您期望的內容。我認爲你可以使用ListView.getFirstVisiblePosition()來計算和調整。

+0

基於jeffamaphone的評論嗯,我可能會誤解這個問題咯......這取決於你正在嘗試做什麼。請注意,您無法獲得「全部」子視圖,因爲ListView會動態管理列表中的視圖......您可以獲取用於創建視圖的每個數據項。因此,如果您嘗試爲每個項目在UI中執行某些操作,則可以使用'getChildAt',但必須小心才能處理那些不返回null的操作。如果您正在嘗試使用這些數據,請使用上面的解決方案。 –

相關問題