我有一个带有edittext的长ListView
,用户可以在Fragment中滚动。当用户停止滚动并返回到同一片段中的列表时,我希望列表滚动到同一个点它是以前的。
如果ListView有20行,并且用户在第5行输入了值,则在向下滚动并返回后,光标应位于第5行。
我正在使用ListView
中的ListFragment
,我有一个自定义adapter
,它扩展了填充ListView的ArrayAdapter
。我不能使用onSaveInstanceState和onActivityCreated,因为我没有离开Fragment。
如何存储ListView
当前位置以便以后使用?
答案 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();
}
}
希望减轻痛苦! :脸红: