Android FragmentPagerAdapter 更新数据

来源:互联网 发布:人工智能专业大学排名 编辑:程序博客网 时间:2024/06/05 17:18

今天在弄ViewPager 其中被FragmentPagerAdapter搞死了 一直更新不了数据 看了很多网上的文章 都不能满足我的需求 然后看到了这篇文章 分享下


摘要

FragmentPagerAdapter 更新数据


在使用ViewPager+FragmentPagerAdapter时候,更新Fragment里数据是不起作用,FragmentPagerAdapter添加或减少Fragment时,前面的Fragment内容更新不起作用等等问题,有的做法是暴力删除fragment列表,如

List<Fragment> fragments = getSupportFragmentManager().getFragments();for (int i = fragments.size() - 1; i >= 0; i--) {    getSupportFragmentManager().beginTransaction().remove(fragments.get(0));}

也有做法是重写FragmentPagerAdapter的instantiateItem(ViewGroup container, int position)方法等等,有效虽有效,但比较粗爆。

       FragmentPagerAdapter.getItem(int position)在更新时候不一定会被调用,所以Fragment更新是无效,来看看FragmentPagerAdapter的父类PagerAdapter中的代码instantiateItem

@Override    public Object instantiateItem(ViewGroup container, int position) {        if (mCurTransaction == null) {            mCurTransaction = mFragmentManager.beginTransaction();        }        final long itemId = getItemId(position);        // Do we already have this fragment?        String name = makeFragmentName(container.getId(), itemId);        Fragment fragment = mFragmentManager.findFragmentByTag(name);        if (fragment != null) {            if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);            mCurTransaction.attach(fragment);        } else {            fragment = getItem(position);            if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);            mCurTransaction.add(container.getId(), fragment,                    makeFragmentName(container.getId(), itemId));        }        if (fragment != mCurrentPrimaryItem) {            fragment.setMenuVisibility(false);            fragment.setUserVisibleHint(false);        }        return fragment;    }

FragmentPagerAdapter里在根据getItemId(int position)来判断当前position里Fragment是否存在,如果存在,则不会创建亦不会更新,那么要让FragmentPagerAdapter的更新生效,那在getItemId(int)里根据数据返回一个唯一的数据ID,当FragmentPagerAdapter更新时,数据ID改变了,那么Fragment就会调用getItem(int)去获取新Fragment,达到更新效果

@Overridepublic long getItemId(int position) {// 获取当前数据的hashCodeint hashCode = fragments.get(position).hashCode();return hashCode;}
在adapter加了上面代码后,效果就出来了。被搞死了,我已经用尽洪荒之力了,要死了


0 0
原创粉丝点击