0

說我有一個145項適配器。和目前在我的列表視圖我有10次展示,其中的觀點代表項目104至113。現在我有一個scrollListener其onScroll方法瞭解ListView childAt方法

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
{ 
    View view = getViewForPosition(??, view);//keep reading for ?? details 
} 

如果我需要爲我firstVisibleItem,其中適配器是視圖項目104,我如何從列表中請求它?我是說listview.getChildAt(0)?或者我說listview.getChildAt(104)

現在我正在使用下面的方法,但基本問題的立場。

public View getViewForPosition(int position, AbsListView listview) { 
     int firstPosition = listview.getFirstVisiblePosition() 
      - ((ListView) listview).getHeaderViewsCount(); 
     int wantedChild = position - firstPosition; 
     // Say, first visible position is 8, you want position 10, wantedChild will now be 2 
     // So that means your view is child #2 in the ViewGroup: 
     if (wantedChild < 0 || wantedChild >= listview.getChildCount()) { 
      return null; 
     } 
     return listview.getChildAt(wantedChild); 
    } 
+0

我認爲一個更好的問題是,爲什麼你需要onScroll方法的視圖?並不是說沒有理由,但通常你想做的任何事情都可以做到View,你可以(也應該)在'getView()'方法中做。 – kcoppock

+0

@kcoppock我很高興你問:http://stackoverflow.com/questions/19041222/finding-pixel-location-of-listview-item-seems-to-return-wrong-value –

回答

0

回答你的問題是「listview.getChildAt(0)」(IF且僅當該元件104是第一要素可見),ListView控件的工作方式是通過重用「行」或創建的元素,因此它會在內部執行某種旋轉機制來填充您的值,但是當涉及到「孩子」時,它將只有一次可見元素的數量,並且這些元素將在所有元素中重用。 所以如果你有300個元素,但是你一次只能看到5個,這意味着列表視圖中的子元素的數量是5 + 1或2來完成「最後」和「第一個」元素效果......

現在,如果你想要的是用於填充視圖的實際元素(而不是視圖本身),你需要做的就是從適配器中取出listview並調用Adapter.getItem(104),這將給你用來填充該行的元素...

希望這有助於...

商祺!

+0

由於某種原因,似乎沒有真正。 –

+0

究竟是不是真的? –

+0

'listview.getChildAt(0)'返回firstVisibleItem iff firstVisibleItem是索引0是有效的。我正在努力解決更大的問題。事情是我需要預測空值,並沒有發生。 –

0

每個實驗,這裏是它是如何工作的。 ListView是適配器的一部分。所以如果一個適配器有500個項目而ListView有10個(10)。 ListView中的十個代表一個動態視圖。因此,如果firstVisibleItem是適配器中的item 217,那麼ListView的索引範圍將是(217,...,226),而listView.getChildCount()仍然會返回10.因此,「listview.getChildAt(0) 「會失敗。