android ListView資料變動後保持螢幕位置不變(類似QQ對話列表)
阿新 • • 發佈:2018-12-29
在網上找的所謂三種方法都不靠譜,比如在onScrollStateChanged事件中用lst_threads.getScaleX()獲取最後位置,不知道為何我除錯時在if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) 的時候無論getScaleX()還是getScaleY()均返回0。
不管怎樣,我已經找到一種更好的替代方法:用getFirstVisiblePosition()獲取當前第一條資料的位置和setSelectionFromTop()設定第一條資料的位置,看程式碼:
int w_cur_pos=lst_threads.getFirstVisiblePosition(); int w_top=lst_threads.getTop(); try { if (pageNo == 1) { Util.showToast(this, R.string.xlistview_err_01); return; } lst_threads.setPageNo(pageNo - 1); int w_cc=model.reloadData(ThreadActivity.this,mSubject,"",lst_threads.getPageNo(), pageSize, true); if (w_cc!=0){ w_cur_pos=w_cur_pos+w_cc+1; } } finally { lst_threads.stopRefresh(); onDone.run(); //lst_threads.resturePosition(); lst_threads.setSelectionFromTop(w_cur_pos,w_top); }
這段程式碼放在下拉重新整理的事件中,獲得前一頁的內容並加到當前的adapter中,列表儲存內容不變,使用者再慢慢下拉看之前刷下來的內容。。