旋转后存储数据自身适配器

时间:2014-04-30 18:58:20

标签: android listview rotation

我有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或使用别的东西?

1 个答案:

答案 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
   }