我有listview的应用程序(一行包含textview,imageview,ratingbar)和我自己的适配器。当我在排序列表视图后旋转屏幕(我在菜单中选择此选项)时,它会在排序之前返回到表单。 我试过覆盖onSaveInstanceState:
@Override
public void onSaveInstanceState(Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putParcelable("listView", listView.onSaveInstanceState());
}
和片段onCreate:
listView.setAdapter(adapter);
if(savedInstanceState!=null)
{
mListInstanceState=savedInstanceState.getParcelable("listView");
listView.onRestoreInstanceState(mListInstanceState);
}
但它不起作用。我是否应该重写onRestoreInstanceState或使用别的东西?
答案 0 :(得分:1)
问题是当方向更改时,重新创建Activity
并且调用onCreate()
时,您正在使用默认列表项设置适配器。
如果您没有为横向/纵向维护不同的layout
,只需在Activity
的清单中添加configChanges
即可避免Activity
重新创建
android:configChanges="orientation|screenSize" // add this line
这将避免重新创建Activity
,并且将使用相同的布局来适应屏幕宽度。确保listView布局宽度设置为match_parent
。
如果您仍希望重新创建Activity
,则需要记住在方向更改时调用onSaveInstanceState
时最后选择的过滤器
@Override
public void onSaveInstanceState(Bundle outState)= {
outState.putString(“selectedFilter","some name");
super.onSaveInstanceState(outState);
}
然后在旋转后调用onCreate
时,您可以获取selectedFilter名称
String filterName = null;
if(savedInstanceState != null){
filterName = savedInstanceState.getString("lastFilter");
}
最后,根据过滤器名称设置listView
项目。
if(filterName != null && filterName.equalsIgnoreCase("some name")){
// filtered list items
} else {
// default list items
}