2011-08-04 74 views
20

我有一個自定義適配器的ListView設置和工作正常。在一個按鈕上單擊基礎數據中的某些內容,因此需要notifyDataSetChanged來刷新ListView。精細。但我也希望ListView滾動到發生更改的行。爲此,我在notifyDataSetChanged後立即調用smoothScrollToPosition。這不起作用。smoothScrollToPosition後notifyDataSetChanged不工作在android

如果我不調用notifyDataSetChanged,那麼滾動工作,所以通知阻止滾動。我可能正在與將來正在處理的事件發生衝突。任何人都可以給我一個指向哪裏出錯的指針?

+1

額外的一點點信息;此行爲發生在模擬器上。當在電話上運行時,情況是混合的;有時滾動有效,有時不滾動。這似乎是通知在順利完成之前是否完成的問題。或者按照什麼順序。 – tbeernot

回答

78

使用post()方法等待列表中,您撥打notifyDataSetChanged()後,即可完成更新:

adapter.notifyDataSetChanged(); 
list.post(new Runnable() { 
    @Override 
    public void run() { 
    //call smooth scroll 
    } 
    }); 
+0

謝謝!這工作。在模擬器上,列表跳到最後,然後到我告訴它去的地方,但在手機上,這是不可見的。 – tbeernot

+0

理論上,該列表應該保留在'notifyDatasetChanged()'之前的相同位置,所以如果使用較少的元素進行刷新,它將首先被有效地結束。 – dmon

+0

試驗顯示notifyDatasetChanged使列表總是跳轉到底部,smoothScrollToPosition使其跳轉,以使條目位於頂部。在仿真器上,這清晰可見,在實際的電話上,清單「不安分」,並且在沒有需要時有動作。 – tbeernot

0

我已經試過DMON的示例代碼,我看到它並不總是工作。

其實我已經找到另一種方法來進行滾動:

adapter.notifyDataSetChanged(); 
channelsListView.setSelection(scrollPos); // it works without smoothScrollToPositionFromTop(..) or smoothScrollToPosition() methods call. 

我發現的主要思想這個答案閱讀後繼續使用上述方法: https://stackoverflow.com/a/20997828/2133585

相關問題