如何将ListFragment中的数据更新为ViewPager的一部分?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (72)

我在Android中使用v4兼容性ViewPager。我的FragmentActivity有一堆数据,这些数据将以不同的方式显示在ViewPager的不同页面上。到目前为止,我只有3个相同的ListFragment实例,但将来我会有3个不同的ListFragments实例。ViewPager在垂直电话屏幕上,列表不是并排的。

现在ListFragment上的一个按钮启动一个单独的整页活动(通过FragmentActivity),该活动返回并且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上通知DataSetChanged,并且有时会显示更新数据,但其他人则遇到IllegalStateException:在onSaveInstanceState之后无法执行此操作。

我的第二次尝试调用了尝试在我的ListFragment中调用更新函数,但getItem在getItem中返回0.根据我试过的文档

使用findFragmentById()或findFragmentByTag()获取对FragmentManager中片段的引用

但我不知道我的碎片的标签或ID!我在ListPragment布局中有一个android:id =“@ + id / viewpager”,还有一个android:id =“@ android:id / list”,但我不认为这些是有用的。

提问于
用户回答回答于

尝试每次实例化Fragement时记录标签。

public class MPagerAdapter extends FragmentPagerAdapter {
    private Map<Integer, String> mFragmentTags;
    private FragmentManager mFragmentManager;

    public MPagerAdapter(FragmentManager fm) {
        super(fm);
        mFragmentManager = fm;
        mFragmentTags = new HashMap<Integer, String>();
    }

    @Override
    public int getCount() {
        return 10;
    }

    @Override
    public Fragment getItem(int position) {
        return Fragment.instantiate(mContext, AFragment.class.getName(), null);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Object obj = super.instantiateItem(container, position);
        if (obj instanceof Fragment) {
            // record the fragment tag here.
            Fragment f = (Fragment) obj;
            String tag = f.getTag();
            mFragmentTags.put(position, tag);
        }
        return obj;
    }

    public Fragment getFragment(int position) {
        String tag = mFragmentTags.get(position);
        if (tag == null)
            return null;
        return mFragmentManager.findFragmentByTag(tag);
    }
}
用户回答回答于

随着FragmentStatePagerAdapter我们似乎可以得到通过,使用其instantiateItem(ViewGroup container, int position)电话。它返回参考片段的位置position。如果FragmentStatePagerAdapter已经持有对片段的引用,instantiateItem只是返回对该片段的引用,并且不调用getItem()它来再次实例化。

所以,假设,我正在看片段#50,并且想要访问片段#49。由于它们很接近,#49很可能已经实例化了。所以,

ViewPager pager = findViewById(R.id.viewpager);
FragmentStatePagerAdapter a = (FragmentStatePagerAdapter) pager.getAdapter();
MyFragment f49 = (MyFragment) a.instantiateItem(pager, 49)

扫码关注云+社区