Android 在同一活动中保存ListView滚动位置

Android 在同一活动中保存ListView滚动位置,android,android-listview,Android,Android Listview,我有一个长列表视图,带有编辑文本,用户可以在片段中滚动。当用户停止滚动并返回到同一片段中的列表时,我希望列表滚动到与以前相同的点。 如果ListView有20行,并且用户在第5行输入了值,则向下滚动并返回后,光标应位于第5行 我正在使用ListFragment中的ListView,我有一个自定义的适配器,它扩展了ArrayAdapter,填充了ListView。我不能使用onSaveInstanceState和onActivityCreated,因为我没有留下片段 如何存储列表视图的当前位置以供

我有一个长
列表视图
,带有编辑文本,用户可以在片段中滚动。当用户停止滚动并返回到同一片段中的列表时,我希望列表滚动到与以前相同的点。 如果ListView有20行,并且用户在第5行输入了值,则向下滚动并返回后,光标应位于第5行

我正在使用
ListFragment
中的
ListView
,我有一个自定义的
适配器
,它扩展了
ArrayAdapter
,填充了ListView。我不能使用onSaveInstanceState和onActivityCreated,因为我没有留下片段


如何存储
列表视图的当前位置以供以后使用?

这是我所知道的最佳解决方案

//将ListView状态(=包括滚动位置)另存为Parceble

Parcelable state = listView.onSaveInstanceState();
//恢复以前的状态(包括所选项目索引和滚动位置)

甚至在将适配器设置为后,也可以恢复上次保存的位置-

// Save the ListView state (= includes scroll position) as a Parceble
Parcelable state = listView.onSaveInstanceState();

// e.g. set new items
listView.setAdapter(adapter);

// Restore previous state (including selected item index and scroll position)
listView.onRestoreInstanceState(state);

您还可以参考以了解更多详细信息。

触发操作后,您现在可以通过以下方式为用户获取列表视图中第一个可见的项目位置:

int position = listview.getFirstVisiblePosition();
无论何时您想稍后再次设置滚动位置,请使用以下命令:

listview.smoothScrollToPosition(position);
您可以使用
SharedReferences
来存储此位置,以防您想将其存储很长时间(多个会话)

注意:如果您的列表是通用的,并且以后可能会更短,以避免
indexOutOfBound
崩溃,请注意您存储的位置


有关如何使用
SharedReferences
的更多信息,请访问ListFragment片段中的此,声明两个int变量以保持滚动位置:

public static class MyListFragment extends ListFragment {

        private int listIndex = -1;
        private int listTop = 0;
然后覆盖onPause()和onResume()以保存和恢复
列表视图的滚动位置,如下所示:

@Override
public void onResume() {
      super.onResume();

   //after setting adapter and your arbitrary codes
      if(listIndex!=-1){
         this.getListView().setSelectionFromTop(index, top);
      }

}

@Override
public void onPause() {
      super.onPause();
      try {
        listIndex = getListView().getFirstVisiblePosition();
        View v = getListView().getChildAt(0);
        listTop = (v != null) ? v.getTop() : 0;
    } catch (Exception e) {
        e.printStackTrace();
    }

}

希望减轻痛苦!!:blush:

您想在屏幕旋转时保存滚动位置、用户存在应用程序或哪种场景?此处可能重复演示。Hi Catalina,如果ListView有20行,并且用户在第5行输入了值,在向下滚动并返回后,光标应该位于第5行。Hi,在onCreate()或onResume()中使用此代码的位置
@Override
public void onResume() {
      super.onResume();

   //after setting adapter and your arbitrary codes
      if(listIndex!=-1){
         this.getListView().setSelectionFromTop(index, top);
      }

}

@Override
public void onPause() {
      super.onPause();
      try {
        listIndex = getListView().getFirstVisiblePosition();
        View v = getListView().getChildAt(0);
        listTop = (v != null) ? v.getTop() : 0;
    } catch (Exception e) {
        e.printStackTrace();
    }

}