【问题标题】:how to set listview's position after configuration change配置更改后如何设置列表视图的位置
【发布时间】:2015-05-06 14:51:43
【问题描述】:

我正在努力恢复我在屏幕旋转配置更改的列表视图中的位置。

在我尝试过的许多事情中,我得出了这个结论:

        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            if (savedInstanceState == null) {
...
                mVisibleItem = -1;
            } else {
                if (savedInstanceState.containsKey(LV_VISIBLE_ITEM)) {
                    mVisibleItem = savedInstanceState.getInt(LV_VISIBLE_ITEM);
                }
            }
            setRetainInstance(true);
        }

我正在尝试在列表视图中设置位置

@Override
public void onResume() {
    super.onResume();
    if (mVisibleItem > 0) {
        mlvDictionaryIndex.setSelectionFromTop(mVisibleItem, 0);
    }
}

然而,令我惊讶的是,在旋转屏幕并观察 mVisibleItem 设置为正确的值后,在 onResume 中我看到 mVisibleItem 等于 -1。怎么会?

【问题讨论】:

    标签: android listview android-fragments


    【解决方案1】:

    使用onSavedInstanceStateListView.onSaveInstanceState()的返回值写入bundle中,并在onActivityCreated中恢复

     @Override
     public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            if (mListView != null) {
                outState.putParcelable(LISTVIEW_INTERNAL_STATE_KEY, mListView.onSaveInstanceState());
            }
     }
    

    数据重新加载后即可调用

    mListView.onRestoreInstanceState(savedInstanceState.getParcelable(LISTVIEW_INTERNAL_STATE_KEY));
    

    【讨论】:

      【解决方案2】:

      覆盖 onSaveInstanceState 如下"

          @Override
      public void onSaveInstanceState(Bundle savedInstanceState) {
          super.onSaveInstanceState(savedInstanceState);
          savedInstanceState.putInt("pos", pos);
      }
      

      然后在您的 onCreate 方法中读取 savedInstanceState 以检查这是方向更改还是新活动。

      private int pos = 0;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
      
          if (savedInstanceState == null) {
           //This is a new activity
          }else{
            pos = savedInstanceState.getInt("");
          }
      

      现在您在列表中有了位置,您可以在配置更改中滚动到此位置。

      【讨论】:

        【解决方案3】:

        也许listview中的数据重新加载后,下面的代码就可以了。

         mlvDictionaryIndex.setSelectionFromTop(mVisibleItem, 0);
        

        所以你可以使用post() 方法,如下所示:

        post(new Runnable() {
             public void run() {
                 mlvDictionaryIndex.setSelectionFromTop(mVisibleItem, 0);
             }
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-05-22
          • 1970-01-01
          • 2011-02-13
          • 1970-01-01
          • 2021-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多