【问题标题】:How can I save the scroll position for my ListView that uses a CursorAdapter?如何保存使用 CursorAdapter 的 ListView 的滚动位置?
【发布时间】:2016-01-19 10:50:53
【问题描述】:

我的 ListView (StickyListHeadersListView) 不保存确切的滚动位置。我引用了这个:

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();
}

【问题讨论】:

    标签: android listview


    【解决方案1】:

    可以使用 savedInstanceState 来保存 ListView 的确切滚动,但是在许多情况下它会随着活动一起被破坏,我们不能轻易地持久保存 savedInstanceState,因为我们只能将其真正转换为 Parcelable 对象,即不是为了持久化而设计的。即使在尝试从 ListView 获取 savedInstanceState 时,我们也会遇到一些问题。 null 通常会返回给我们,因为 Android 文档指定在“没有任何有趣的内容可保存”时发生。好吧,在这种情况下,卷轴很有趣!可悲的是,Android 并不总是会给我们这个,这会带来很多问题......

    事实上,我查看了更多内容并注意到 Android 文档说“此状态应仅包含非持久性或以后无法重建的信息。例如,您永远不会将当前位置存储在屏幕上,因为当视图的新实例放置在其视图层次结构中时,将再次计算该值。”,所以这不是要走的路。

    当然,我们仍然可以使用您正在使用的方法,但是它永远不会在所有设备上都准确无误。对于一般的应用程序,我建议只保留列表项的索引并从顶部开始用户。

    我认为除了从 ListView 本身获取详细信息之外,我们无法使用任何其他方法来访问滚动位置。因此,我们只能使用我们得到的东西。

    你可能是个超级疯狂的人,尝试将 ListView 放在 ScrollView 中(或者其他一些容器也可以),然后我们可以使用 getScrollY() 和 setScrollY() 之类的方法,但这依赖于始终存在相同数量的列表项和所有列表项保持相同的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-26
      • 2015-03-05
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      相关资源
      最近更新 更多