2017-10-05 69 views
0

在我的應用程序中,我有一個ListView。列表中每個項目的數據是SomeItem類的一個實例。該列表具有自定義視圖ArrayAdapter,可顯示每個項目的各個字段並覆蓋getView()方法。用於列表視圖初始化的框架代碼:將特定的ListView項目滾動到視圖中

ListView listView = (ListView) foo.getViewById(R.id.listView); 

ArrayAdapter<SomeItem> adapter = new ArrayAdapter<SomeItem>(activity, R.layout.listItemView, R.id.textView) { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Code to build the view with multiple child views 
    } 
} 

現在假設我有一個SomeItem實例。它的相關視圖可能會或可能不在屏幕上顯示的ListView的部分中。如果不是,我怎樣才能讓ListView將這個特定的項目滾動到視圖中?

我找到的唯一有點相關的方法是ListView#requestChildRectangleOnScreen(),它要求我提供一個我沒有的子視圖。我有適配器的項目。所以我仍然不確定如何拼湊在一起。任何指針?

+0

這個問題不是很清楚。你能否以圖像形式向我們展示你的需求? –

+0

我編輯了這個問題。現在更清楚了嗎? – user149408

+0

你將如何確定哪個項目需要在屏幕上?你有什麼邏輯? –

回答

1

你可以嘗試以下方法:

  1. 計算你想看到的SomeItem項目的位置。您可以遍歷您傳遞給適配器的SomeItem列表。

  2. 使用listView.getFirstVisiblePosition(),listView.getLastVisiblePosition()和計算的位置來檢查項目是否在列表中可見。

  3. 如果該物品不可見,請致電listView.smoothScrollToPosition(calculatedPosition)滾動到listView

+0

謝謝,看起來很有希望。我會贊成;一旦我成功地嘗試過,接受將會隨之而來。看看API,有'ArrayAdapter#getPosition()'應該返回的位置,所以我想我不會需要一個迭代器。另外,我是否真的需要做#2或滾動到已經在視圖中的項目是否爲真正的無操作(意味着列表根本不會移動,而不是移動到默認位置)? – user149408

+0

我真的不記得'smoothScrollToPosition()'如何與一個已經顯示的項目一起工作 - 它可能會導致一個小抽搐將它作爲一個頂級項目。也許不會。或者,也許這正是你想要的。因此,請嘗試不使用* step2 *滾動,並查看結果是否符合您的要求。 –

+0

我試了一下:滾動到列表視圖的頂部,選擇屏幕底部的項目(屏幕上的部分少於列表的一半),並等待列表填滿。直到新的項目開始推送屏幕上的選擇,然後它移動到屏幕的底部並停留在那裏,沒有抽搐。正是我所渴望的! – user149408