2015-10-20 69 views
1

我的ListView(StickyListHeadersListView)不保存確切的滾動位置。我引用這一點:如何保存使用CursorAdapter的ListView的滾動位置?

Maintain/Save/Restore scroll position when returning to a ListView

當用戶點擊列表中的一個項目,我使用SharedPreferences應用程序過渡到活動之前保存的「指數」和「頂」。當我按回活動返回到帶有ListView的片段時,列表將從它離開時進入第一個可見列表項的頂部,但不是確切的位置(即,如果第一個可見項被中途切斷,回到片段時應該中途切斷)。

換句話說,偏移不是保存。就像我說的那樣,它可以保存第一個可見的位置,但確切的滾動不會被保存。

mAdapter = new PeopleAdapter(getActivity(), null); 
    mList = (StickyListHeadersListView) rootView.findViewById(R.id.stickyList); 
    mList.setAdapter(mAdapter); 
    mList.setAreHeadersSticky(true); 
    mList.setDividerHeight(0); 
    mList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Cursor cursor = mAdapter.getCursor(); 
      if (cursor != null && cursor.moveToPosition(position)) { 
       MainActivity.setIndex(mList.getFirstVisiblePosition()); 
       View v = mList.getListChildAt(0); 
       int top = (v == null) ? 0 : (v.getTop() - mList.getPaddingTop()); 
       MainActivity.setTop(top); 
       Intent intent = new Intent(getActivity(), ContactDetailActivity.class); 
       startActivity(intent); 
     } 
    }); 

光標加載完成後,我打電話

public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     android.util.Log.i(TAG, "Cursor loaded. (" + data.getCount() + " rows)"); 
     mList.setSelectionFromTop(MainActivity.getIndex(), MainActivity.getTop()); 
     mAdapter.changeCursor(data); 
     mAdapter.notifyDataSetChanged(); 
} 

回答

0

它可以使用savedInstanceState節省然而ListView控件的精確滾動,這是用在很多情況下的活動一起被毀壞並且我們不能輕易堅持savedInstanceState,因爲我們只能將其真正轉換爲Parcelable對象,該對象不是被設計爲持久的。即使試圖從ListView中獲取savedInstanceState,我們也遇到了一些問題。通常會向我們返回null,因爲Android文檔指定在「沒有什麼有趣的保存」時發生。那麼,在這種情況下,滾動非常有趣!可悲的是,Android並不總是會給我們這個,但它帶來了很多問題...

事實上,我更加註意了這一點,並注意到Android文檔中提到「這個狀態應該只包含信息例如,你永遠不會在屏幕上存儲你當前的位置,因爲當視圖的新實例被放置在它的視圖層次結構中時,它將被再次計算。「,所以這不是要走的路。

當然,我們仍然可以使用您使用的方法,但是它不會在所有設備上精確。對於一般的應用程序,我建議只保留列表項目的索引並將用戶重新啓動回頂部。

我不認爲除了從ListView本身獲取詳細信息外,還有其他任何可用於訪問滾動位置的方法。因此,我們只能使用我們給的東西。我們可以使用像getScrollY()和setScrollY()這樣的方法,但這依賴於總是存在的東西是相同數量的列表項目和所有列表項目保持相同的大小。