【问题标题】:changeorientation call onpageselected before oncreateview改变方向调用 onpageselected 在 oncreateview 之前
【发布时间】:2023-03-10 03:56:02
【问题描述】:

我有一个带有 3 个片段的 ViewPager;在我的主要活动中,我处理onPageChangeListener

private class CustomPageChangeListener extends ViewPager.SimpleOnPageChangeListener{

    @Override
    public void onPageSelected(int position) {

        fragments.get(position).onShowedFragment(context);
        super.onPageSelected(position);
    }
}

onShowedFragment(context) 的调用将数据加载到片段中(我按需加载数据)。我将数据加载到ListView:

@Override
public void onShowedFragment(Context context) {
    databaseService = DatabaseService.getInstance(context);
    mAdapter = new Capitulo100ListAdapter(context);
    databaseService.capitulo100ObjectSet.setAdapter(mAdapter);
    lst100.setAdapter(mAdapter);

    try {
        //load my data
    } catch (Exception e) {
        //...
    }
    super.onShowedFragment(context);
}

当我旋转设备时,Android 会重新创建活动并调用 onPageSelected,并在我的片段上调用 ​​onShowedFragment 方法,但当时名为 lst100 的 ListView 为空(我在fragment的onCreateView方法中初始化视图),那么lst100.setAdapter(mAdapter)这行会报错。

我没有使用android:configChanges

设备旋转后创建ListView时如何上传数据?

【问题讨论】:

    标签: android listview android-fragments android-viewpager


    【解决方案1】:
        private class CustomPageChangeListener extends ViewPager.SimpleOnPageChangeListener{
    
        @Override
        public void onPageSelected(int position) {
            // call super.onPageSelected() before onShowedFragment()
            super.onPageSelected(position);
            fragments.get(position).onShowedFragment(context);
           
        }
    }
    

    //在onCreateView()中初始化视图

    databaseService = DatabaseService.getInstance(context);
    mAdapter = new Capitulo100ListAdapter(context);
    databaseService.capitulo100ObjectSet.setAdapter(mAdapter);
    

    //如果列表不为空,则设置适配器。

       @Override
    public void onShowedFragment(Context context) {
        if(lst!=null)
        lst100.setAdapter(mAdapter);
    
        try {
            //load my data
        } catch (Exception e) {
            //...
        }
        super.onShowedFragment(context);
    }
    

    //如果仍然无法使用,请使用 MVVM 架构组件。它将处理与活动重新创建相关的所有问题。

    【讨论】:

      【解决方案2】:

      如果您想在向用户显示片段时调用某个方法,请使用在显示相应片段时从适配器调用的setUserVisibleHint

      【讨论】:

        【解决方案3】:

        看来您要么在活动重新创建后未初始化 lst100,要么无论如何都将其初始化错误,尝试在 onShowedFragment 本身中获取对 ListView 的引用。

        @Override
        public void onShowedFragment(Context context) {
            ...
            
            ListView listView = findViewById<ListView>(R.id.your_listview_id);
            listView.setAdapter(mAdapter);
        
            ...
            super.onShowedFragment(context);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-18
          • 1970-01-01
          • 1970-01-01
          • 2017-08-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多