改变方向调用 onpageselected 在 oncreateview 之前
Posted
技术标签:
【中文标题】改变方向调用 onpageselected 在 oncreateview 之前【英文标题】:changeorientation call onpageselected before oncreateview 【发布时间】:2014-07-27 02:27:38 【问题描述】:我有一个带有 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时如何上传数据?
【问题讨论】:
【参考方案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);
【讨论】:
以上是关于改变方向调用 onpageselected 在 oncreateview 之前的主要内容,如果未能解决你的问题,请参考以下文章
在ViewPager上,在onPageSelected上的片段上启动动画
如何从 ViewPager 的 onPageSelected AsyncTask 到 Fragments?