美文网首页Android工程师Android知识Android开发
Android填坑之路——FragmentPagerAdapte

Android填坑之路——FragmentPagerAdapte

作者: PeOS | 来源:发表于2017-03-05 17:42 被阅读137次

原因分析

在使用ViewPager+FragmentPagerAdapter时候,更新Fragment里数据是不起作用,FragmentPagerAdapter添加Fragment、减少Fragment、切换顺序时,前面的Fragment内容更新不起作用。这是因为
FragmentPagerAdapter的创建fragment机制所导致的。定位到FragmentPagerAdapter源码,其中创建更新fragment的方法是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;
    }

instantiateItem方法中会根据itemId生成name来查找fragment是否已经存在,如果不存在则创建新的fragment,否则不创建新的fragment。
itemId是通过getItemId方法获取的,那么,定位到getItemId方法:

public long getItemId(int position) {
        return position;
    }

getItemId仅仅只是返回当前的position。这就是FragmentPagerAdapter无法更新的原因了。比如FragmentPagerAdapter有3个fragment, 那么通过getItemId获取到的itemId就为0, 1, 2,这时变更数据,把第一个fragment的数据与第三个fragment交换,但getItemId获取到的itemId仍是0, 1, 2,instantiateItem方法里就不会去执行新的创建或更新数据了。这就是FragmentPagerAdapter无法更新数据的原因了。

解决方案

1、暴力移除fragment

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

2、重写instantiateItem方法

3、重写getItemId方法

@Override
public long getItemId(int position) {
    // 获取当前数据的hashCode
    int hashCode = data.get(position).hashCode();
    return hashCode;
}

相关文章

  • Android填坑之路——FragmentPagerAdapte

    原因分析 在使用ViewPager+FragmentPagerAdapter时候,更新Fragment里数据是不起...

  • Android ExoPlayer 填坑之路

    自从上次做完视频播放器调研以后,心里就知道,肯定以后这块东西都是我做,果不其然,公司对视频播放这块不断的优化。我就...

  • 填坑之路

    总有一点东西,用一次查一次,查一次忘一次 IE 11不兼容VUE Babel 默认只转换新的 JavaScript...

  • ReactNative填坑之路

    一.ViewPagerAndroid之坑 举个栗子, 然而在HotSaleLis这个Component里面就不能超...

  • 填坑之路:JSTL

    一、什么是JSTL JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能,它是apa...

  • idea 填坑之路

    1、jdk与jetty有版本匹配的问题,如果版本不匹配会出现不能识别jsp的错误。 jdk1.8匹配的jett...

  • 填坑之路漫长

    最近怎么说呢,大家都感觉要凉凉了。哪里都是个坑,只不过从这个坑里跳到了另外一个坑里。 好好的填坑,才是自己该做的。...

  • Vue填坑之路

    问题1:TypeError: Cannot read property 'minify' of undefined

  • android8.0之程序员开发时的填坑经历

    填坑一: 实现手动更新apk时的填坑历程,两个步骤: 步骤1)读写权限申请: 从Android6.0开始,在更新a...

  • Android开发之路填坑与挖坑记录

    好久不发文了,下笔如有鬼。半天都吐不出几个字来,自从换了新工作以后,真的是忙到没朋友,压榨的留给学习的时间寥寥无几...

网友评论

    本文标题:Android填坑之路——FragmentPagerAdapte

    本文链接:https://www.haomeiwen.com/subject/nwjegttx.html