2015-10-20 67 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()这样的方法,但这依赖于总是存在的东西是相同数量的列表项目和所有列表项目保持相同的大小。