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

时间:2015-05-06 09:21:31

标签: android android-listview

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

我正在使用ListView中的ListFragment,我有一个自定义adapter,它扩展了填充L​​istView的ArrayAdapter。我不能使用onSaveInstanceState和onActivityCreated,因为我没有离开Fragment。

如何存储ListView当前位置以便以后使用?

3 个答案:

答案 0 :(得分:0)

我知道的最佳解决方案

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

Parcelable state = listView.onSaveInstanceState();

//恢复以前的状态(包括选定的项目索引和滚动位置)

listView.onRestoreInstanceState(state);

即使将适配器设置为 -

,您也可以恢复上次保存的位置
// 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);

您还可以参考here了解更多详情。

答案 1 :(得分:0)

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

int position = listview.getFirstVisiblePosition();

每当您想稍后再次设置滚动位置时,请使用以下内容:

listview.smoothScrollToPosition(position);

如果您想长时间存储(多个会话),可以使用SharedPReferences存储此位置。

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

有关如何使用SharedPreferences的详细信息,请访问此link

答案 2 :(得分:0)

在ListFragment片段中,声明两个int变量来保存滚动位置:

public static class MyListFragment extends ListFragment {

        private int listIndex = -1;
        private int listTop = 0;

然后重写onPause()和onResume()以保存和恢复ListView的滚动位置,如下所示:

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

}

希望减轻痛苦! :脸红: