作为 ViewPager 的一部分更新 ListFragment 中的数据 [英] Update data in ListFragment as part of ViewPager

查看:25
本文介绍了作为 ViewPager 的一部分更新 ListFragment 中的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm using the v4 compatibility ViewPager in Android. My FragmentActivity has a bunch of data which is to be displayed in different ways on different pages in my ViewPager. So far I just have 3 instances of the same ListFragment, but in the future I will have 3 instances of different ListFragments. The ViewPager is on a vertical phone screen, the lists are not side-by-side.

现在,ListFragment 上的一个按钮启动一个单独的整页活动(通过 FragmentActivity),该活动返回且 FragmentActivity 修改数据、保存数据,然后尝试更新其 ViewPager 中的所有视图.就在这里,我被卡住了.

Now a button on the ListFragment starts an separate full-page activity (via the FragmentActivity), which returns and FragmentActivity modifies the data, saves it, then attempts to update all views in its ViewPager. It is here, where I am stuck.

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 之后无法执行此操作.

Now as you can see, my first attempt was to notifyDataSetChanged on the entire FragmentPagerAdapter, and this showed to update the data sometimes, but others I got an IllegalStateException: Can not perform this action after onSaveInstanceState.

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

My second attempt involed trying to call an update function in my ListFragment, but getId in getItem returned 0. As per the docs I tried by

从 FragmentManager 获取对 Fragment 的引用,使用findFragmentById() 或 findFragmentByTag()

acquiring a reference to the Fragment from FragmentManager, using findFragmentById() or findFragmentByTag()

但我不知道我的 Fragment 的标签或 ID!我有一个 android:id="@+id/viewpager" 用于 ViewPager,还有一个 android:id="@android:id/list" 用于 ListFragment 布局中的 ListView,但我认为这些没有用.

but I don't know the tag or id of my Fragments! I have an android:id="@+id/viewpager" for ViewPager, and a android:id="@android:id/list" for my ListView in the ListFragment layout, but I don't think these are useful.

那么,我该怎么做:a) 一次性安全地更新整个 ViewPager(理想情况下将用户返回到他之前所在的页面) - 用户看到视图更改是可以的.或者最好,b) 在每个受影响的 ListFragment 中调用一个函数来手动更新 ListView.

So, how can I either: a) update the entire ViewPager safely in one go (ideally returning the user to the page he was on before) - it is ok that the user see the view change. Or preferably, b) call a function in each affected ListFragment to update the ListView manually.

如有任何帮助,我们将不胜感激!

Any help would be gratefully accepted!

推荐答案

尝试在每次实例化 Fragment 时记录标签.

Try to record the tag each time a Fragement is instantiated.

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);
    }
}

这篇关于作为 ViewPager 的一部分更新 ListFragment 中的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆