Android应用ViewPager和TabLayout动态加载Fragment,并实现view和tab动态刷新。

原创 2016年12月01日 23:35:22

Android应用ViewPager和TabLayout动态加载Fragment

 

1 应用背景和目的

项目中需要实现根据服务器端返回的主题模块加载相应的主题内容,其中有三个主题模块为默认加载,该应用程序启动时手机端需加载出来,其余主题模块根据网络请求服务器端返回的主题进行加载。达到由服务器端自动配置主题,推送给手机用户动态加载相应主题内容的效果。

下图为模拟示例,其中tab0、tab1、tab2为默认主题,tab3、tab4、tab5为网络端推动过来的主题模块,并且加载插入的位置在tab0与tab1之间。


2 实现框架

Android端app利用ViewPager和TabLayout的方式实现相应主题内容Fragment的动态加载。示例程序app name为VFTest,运用这个方式,动态加载fragment之后,切换tab,会出现程序崩溃,如下图所示。


查看崩溃得logcat日志如下图所示:


崩溃得原因是Can't change tag of fragment CommonFragment{44d090b0#1 id=0x7f0c0071 android:switcher:2131492977:1}。分析知FragmentPagerAdapter为之前加载好的Fragment设置的tag,由于在原有位置插入了一个新的Fragment,导致两个tag不一致,switcher在切换时出错抛出的异常。

3 解决方案

         根据问题,拟解决方案是,当在原有位置加载新的Fragment时,重新调用FragmentPagerAdapter的instantiateItem接口,刷新adapter的中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;
}
其中final long itemId = getItemId(position);决定是否重新加载新的Fragment,于是需要在自定的FragmentPagerAdapter中重写getItemId,得到不同的itemId,即:
@Override
public long getItemId(int position) {
    super.getItemId(position);
    if (fragments != null) {
        if (position < fragments.size()) {
            return fragments.get(position).hashCode();       //important
        }
    }
    return super.getItemId(position);
}

不同的Fragment分配的HashCode不同,从而实现刷新adapter中的fragment。

 

当然可能还遇到另一个问题,就是加载的Fragment的内容没有来得及刷新,这里在动态加载之后,还需要记录当前ViewPager的Item的位置,动态加载之后,需要跳到其对应的原有Fragment重置之后的位置,才能即时刷新Fragment内容。

Android TabLayout修改标题

TabLayout修改标题要获取它里面的Tab来进行设置,调用tabLayout.getTabAt(index).setText(name)就可以设置第index个的标题了。 从源码中发现,当我们调...
  • cc2278863927
  • cc2278863927
  • 2016年08月24日 17:42
  • 2769

TabLayout的ViewPager中的Fragment点击刷新的问题

使用Fragment的时候难免会遇到想在视力可见或不可见之中做些操作,此时通常想到类似Activity的onResume()和onPause()方法。Fragment中也确实也这两个方法,然而亲测su...
  • nnmmbb
  • nnmmbb
  • 2017年03月31日 14:06
  • 2021

仿今日头条TabLayout,侧滑,上拉加载下拉刷新

正文 今天给大家讲解一下TabLayout+deawableLayout实现自定义下拉刷新、上拉加载和侧滑删除效果。 首先写他的布局 主页面的布局  侧拉以及TabLayout     ...
  • XiaoCui9
  • XiaoCui9
  • 2017年09月20日 14:15
  • 413

Android开发:顶部&底部Tab导航栏实现(TabLayout+ViewPager+Fragment)

添加依赖包: compile ‘com.android.support:design:22.2.0‘ XML
  • TS_learner
  • TS_learner
  • 2017年05月02日 21:59
  • 407

TabLayout结合ListView切换改变数据并且监听

前言项目中经常会用到选项卡,目的就是节省空间,然后切换的时候根据当前选项展示不同的内容,今天我们来介绍一种实现方式,先看效果图这里采用的是TabLayout结合ListView进行数据的展示和点击切换...
  • Small_Lee
  • Small_Lee
  • 2016年10月08日 17:00
  • 3962

TabLayout实现动态加载Fragment

主要讲的就是我们平常用TabLayout实现的时候就不用加载太多的Fragment,我们可以用一个动态的Fragment,就可以实现我们想要的效果...
  • Star_Q
  • Star_Q
  • 2017年11月08日 10:48
  • 202

周考联系横向滑动菜单+轮播+listview+上下拉刷新加载---主页面布局---tablayout+占位布局

xml version="1.0" encoding="utf-8"?> RelativeLayout xmlns:android="http://schemas.android.com/apk/re...
  • ch5211314
  • ch5211314
  • 2018年01月14日 12:00
  • 10

TabLayout和动态生成fragment的个数

1.在布局中先书写tablayout的布局,以及与之相对应的viewpager android.support.design.widget.TabLayout android:layout_...
  • m0_37756225
  • m0_37756225
  • 2017年03月30日 20:15
  • 928

TabLayout + ViewPager + Fragment 实现动态框架

TabLayout + ViewPager + Fragment 实现动态框架先看一下效果图相信大家RadioGroup+ViewPager或者FragmentTabHost+ViewPager 的...
  • qq_16666847
  • qq_16666847
  • 2016年11月22日 21:16
  • 841

动态加载fragment配合TabLayout

这种配合使用TabLayout来控制,获取position比较方便,fragment不需要一次性全部加载,而是在第一次使用的时候加载。也需要WindowManager和事务进行管理。因为没有用到Vie...
  • xxkalychen
  • xxkalychen
  • 2016年12月18日 16:54
  • 2408
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android应用ViewPager和TabLayout动态加载Fragment,并实现view和tab动态刷新。
举报原因:
原因补充:

(最多只允许输入30个字)