我正在使用 Android 中的 v4 兼容性 ViewPager。我的 FragmentActivity 有一堆数据,需要在 ViewPager 的不同页面上以不同的方式显示。到目前为止,我只有三个相同 ListFragment 的实例,但将来会有三个不同 ListFragment 的实例。ViewPager 在垂直手机屏幕上,列表并不是并排的。
现在,ListFragment 上的一个按钮通过 FragmentActivity 启动一个单独的全屏活动,然后该活动返回并修改数据,保存数据,然后尝试更新其 ViewPager 中的所有视图。在这里,我卡住了。
public class ProgressMainActivity extends FragmentActivity
{
MyAdapter mAdapter;
ViewPager mPager;
@Override
public void onCreate(Bundle savedInstanceState)
{
...
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.viewpager);
mPager.setAdapter(mAdapter);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
...
updateFragments();
...
}
public void updateFragments()
{
//Attempt 1:
//mAdapter.notifyDataSetChanged();
//mPager.setAdapter(mAdapter);
//Attempt 2:
//HomeListFragment fragment = (HomeListFragment) getSupportFragmentManager().findFragmentById(mAdapter.fragId[0]);
//fragment.updateDisplay();
}
public static class MyAdapter extends FragmentPagerAdapter implements
TitleProvider
{
int[] fragId = {0,0,0,0,0};
public MyAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public String getTitle(int position){
return titles[position];
}
@Override
public int getCount(){
return titles.length;
}
@Override
public Fragment getItem(int position)
{
Fragment frag = HomeListFragment.newInstance(position);
//Attempt 2:
//fragId[position] = frag.getId();
return frag;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE; //To make notifyDataSetChanged() do something
}
}
public class HomeListFragment extends ListFragment
{
...
public static HomeListFragment newInstance(int num)
{
HomeListFragment f = new HomeListFragment();
...
return f;
}
...
现在你可以看到,我的第一次尝试是在整个FragmentPagerAdapter上调用notifyDataSetChanged,这有时会更新数据,但其他时候我会收到一个IllegalStateException: Can not perform this action after onSaveInstanceState。我的第二次尝试是尝试在ListFragment中调用一个更新函数,但是getItem中的getId返回0。根据文档,我尝试通过从FragmentManager获取对Fragment的引用来解决此问题,使用findFragmentById()或findFragmentByTag(),但我不知道Fragment的标签或ID!我在ViewPager中有一个android:id="@+id/viewpager",在ListFragment布局中有一个android:id="@android:id/list"用于我的ListView,但我认为这些都没有用处。
那么,我应该如何: a)一次安全地更新整个ViewPager(理想情况下将用户返回到之前所在的页面)- 用户可以看到视图更改,这是可以接受的。 或者更好的选择是, b)调用每个受影响的ListFragment中的函数以手动更新ListView。
非常感谢任何帮助!
FragmentStatePagerAdapter
,按照 @mblackwell8 的建议,使用上面的代码,即a.instantiateItem(viewPager, viewPager.getCurrentItem());
(来消除 49),可以完美地运行。 - Cedric SimoninstantiateItem
的调用都应该被startUpdate
/finishUpdate
调用所包围。详细信息请参见我对类似问题的回答:https://dev59.com/G2Yr5IYBdhLWcg3wAFg0#41345283 - morgwai