如何在ViewPager中的各个Fragment间传递数据并刷新Fragment界面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在ViewPager中的各个Fragment间传递数据并刷新Fragment界面相关的知识,希望对你有一定的参考价值。

ViewPager的数据是通过PageAdapter来装载的,刷新数据的方法有以下:
调用adapter.notifyDataSetChanged(); 刷新控件,但是要覆盖PagerAdapter的getItemPosition方法,并返回 return POSITION_NONE;
利用PagerAdapter的工作机制,就是PagerAdapter的执行顺序, PagerAdapter作为ViewPager的适配器,无论ViewPager有多少页,PagerAdapter在初始化时也只初始化开始的2个View,即调用2次instantiateItem方法。而接下来每当ViewPager滑动时,PagerAdapter都会调用destroyItem方法将距离该页2个步幅以上的那个View销毁,以此保证PagerAdapter最多只管辖3个View,且当前View是3个中的中间一个,如果当前View缺少两边的View,那么就instantiateItem,如里有超过2个步幅的就destroyItem。
每当Adapter调用instantiateItem时,运用View.setTag方法将该View标识。当需要更新这个View的数据时,通过调用ViewPager.findViewWithTag方法找到相应的View,然后更新View中的数据。
参考技术A 如果Fragment已经存在,试图通过fragment.setArguments(bundle)传递参数将导致异常:
12-02 00:14:55.375: E/androidRuntime(8492): java.lang.IllegalStateException: Fragment already active
12-02 00:14:55.375: E/AndroidRuntime(8492): at android.support.v4.app.Fragment.setArguments(Fragment.java:548)
我更新Fragment的常用办法是,为Fragment定义一个public的方法:
// To update fragment in ViewPager, we should implement a public method for the fragment,
// and do updating stuff in this method.
public void updateDate(Date date)
mDate = date;
mTextView.setText(mDate.toString());

然后获取需要更新的Fragment,再然后调用这个方法。
考虑到你只有4个Fragment,可以尝试在activity内用一个Array或者List保存这4个fragment的实例(这种法子比较笨)。
而且需要使用FragmentPagerAdapter,而不是FragmentStatePagerAdapter,这样在ViewPager中切换页面时,fragment的实例也不会被销毁。可以参考我的这篇文章 如何更新及替换ViewPager中的Fragment

在Viewpager中的一个Fragment中添加一个ViewPager

参考技术A 在现在很多的应用程序中都会用到ViewPager嵌套ViewPager的情况,比如掌上英雄联盟。

如图,下面的四个按钮是控制一个ViewPager,在使用到ViewPager嵌套ViewPager的时候,外层的ViewPager必须设置不能滑动,以免造成两个ViewPager产生冲突,在这里的第一个Fragment中也用到了一个ViewPager,并结合TabLayout实现一个ViewPager的使用。我们来详细介绍这一个Fragment中的ViewPager。

tabIndicatorHeight是设置TabLayout下的标志线的大小,在设置为0dp,是为了隐藏标志线。tabMode是设置tablayout是固定或是滑动的,fixed为固定,scrollable为可以滑动。app:tabGravity="fill"设置布满。tabSelectedTextColor设置tab选中文字的颜色,tabTextColor设置tab为选中的颜色。

为ViewPager设置适配器,ViewPager设置的是FragmentPagerAdapter,并重写getItem(),getCount(),getPageTitle()这三个方法。mTablayout.setupWithViewPager(mViewPager);将tablayout与viewpager关联在一起。
为tablayout设置OnTabSelectedListener和为viewpager设置OnPageChangeListener。
在这里要特别说明的是mViewPager.setAdapter(new FragmentPagerAdapter(getChildFragmentManager()) 中需要用到的是getChildFragmentManager(),而不是getSupportFragmentManager。
设置为getSupportFragmentManager()的时候,在外面的viewpager滑动后里面的viewpager就显示不了。

以上是关于如何在ViewPager中的各个Fragment间传递数据并刷新Fragment界面的主要内容,如果未能解决你的问题,请参考以下文章

在Viewpager中的一个Fragment中添加一个ViewPager

如何确定 Fragment 何时在 ViewPager 中可见

如何从 MainActivity 中的 Fragment 访问适配器?我正在使用带有 viewpager 的标签,所以没有交易等方法

如何在 ViewPager 中从 Activity 移动到 Fragment?未找到片段 ID 的视图

当 ViewPager 中的片段出现和消失时如何执行一些代码

如何在 Fragment 对象中控制 ViewPager 更改页面