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

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

问题描述

我使用的是Android中的V4的兼容性ViewPager。我的FragmentActivity有一组数据将被显示在我的ViewPager不同的页面不同的方式。到目前为止,我只是有相同的ListFragment的3个实例,但将来我也会有不同的ListFragments的3个实例。该ViewPager是一个垂直的手机屏幕上,名单不是并排侧。

现在的ListFragment一个按钮启动一个单独的整版活动(通过FragmentActivty),返回和FragentActivity修改数据,将其保存,然后尝试更新其ViewPager的所有意见。这是我在这里卡住了。

 公共类ProgressMainActivity扩展FragmentActivity
{
    MyAdapter mAdapter;
    ViewPager mPager;

    @覆盖
    公共无效的onCreate(包savedInstanceState)
    {
    ...
        mAdapter =新MyAdapter(getSupportFragmentManager());

        mPager =(ViewPager)findViewById(R.id.viewpager);
        mPager.setAdapter(mAdapter);
    }

    @覆盖
    保护无效onActivityResult(INT申请code,INT结果code,意图数据)
    {
        ...
        updateFragments();
        ...
    }
    公共无效updateFragments()
    {
        //尝试1:
        //mAdapter.notifyDataSetChanged();
        //mPager.setAdapter(mAdapter);

        //尝试2:
        // HomeListFragment片段=(HomeListFragment)getSupportFragmentManager()findFragmentById(mAdapter.fragId [0])。
        //fragment.updateDisplay();
    }

    公共静态类MyAdapter扩展FragmentPagerAdapter工具
         TitleProvider
    {
      INT [] fragId = {0,0,0,0,0};
      公共MyAdapter(FragmentManager FM)
      {
         超(FM);
      }
      @覆盖
      公共字符串的getTitle(INT位置){
         回到标题[位置]
      }
      @覆盖
      公众诠释getCount将(){
         返回titles.length;
      }

      @覆盖
      公共片段的getItem(INT位置)
      {

         片段FRAG = HomeListFragment.newInstance(位置);
         //尝试2:
         // fragId [位置] = frag.getId();
         返回FRAG;
      }

      @覆盖
      公众诠释getItemPosition(Object对象){
         返回POSITION_NONE; //为了使notifyDataSetChanged()做一些事情
     }
   }

    公共类HomeListFragment扩展ListFragment
    {
    ...
        公共静态HomeListFragment的newInstance(INT NUM)
        {
            HomeListFragment F =新HomeListFragment();
            ...
            返回F;
        }
   ...
 

现在,你可以看到,我的第一次尝试是notifyDataSetChanged对整个FragmentPagerAdapter,这表明有时候更新数据,但其他人我得到了一个IllegalStateException:无法执行的onSaveInstanceState之后,此操作。

我的第二次​​尝试involed试图调用一个更新功能在我的ListFragment,但在的getId返回的getItem 0。每次我试图通过

该文档
  

获取基准从FragmentManager的片段,使用   findFragmentById()或findFragmentByTag()

但我不知道我的片段的标签或标识!我有一个机器人:ID =@ + ID / viewpager的ViewPager,和机器人:ID =@机器人:ID /列表我在ListFragment布局的ListView,但我不认为这是有用的<。 / P>

那么,怎样才能我要么一)安全更新一气呵成整个viewpager(用户理想情况下返回到页面,他之前) - 这是确定用户看到的视图变化。 或者preferably,b)可在每个受影响的ListFragment功能手动更新的ListView。

任何帮助将欣然接受!

解决方案

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

 公共类MPagerAdapter扩展FragmentPagerAdapter {
    私人地图&LT;整数,字符串&GT; mFragmentTags;
    私人FragmentManager mFragmentManager;

    公共MPagerAdapter(FragmentManager FM){
        超(FM);
        mFragmentManager = FM;
        mFragmentTags =新的HashMap&LT;整数,字符串&GT;();
    }

    @覆盖
    公众诠释getCount将(){
        返回10;
    }

    @覆盖
    公共片段的getItem(INT位置){
        返回Fragment.instantiate(mContext,AFragment.class.getName(),NULL);
    }

    @覆盖
    公共对象instantiateItem(ViewGroup中的容器,INT位置){
        obj对象= super.instantiateItem(集装箱,位置);
        如果(OBJ的instanceof片段){
            //这里记录的片段标记。
            片f =(片段)目标文件;
            字符串变量= f.getTag();
            mFragmentTags.put(位置,标记);
        }
        返回OBJ;
    }

    公共片段getFragment(INT位置){
        字符串变量= mFragmentTags.get(位置);
        如果(标记== NULL)
            返回null;
        返回mFragmentManager.findFragmentByTag(标签);
    }
}
 

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.

Now a button on the ListFragment starts an separate full-page activity (via the FragmentActivty), which returns and FragentActivity modifies the data, saves it, then attempts to update all views in its ViewPager. It is here 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;
        }
   ...

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.

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

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

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.

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!

解决方案

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

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

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