先看下这样一段代码

private String titles[] = new String[]{"今天", "这周", "这月", "今年"};boolean[] fragmentsUpdateFlag = { false, false, false, false };StarFragment todatFragmet=new StarFragment(titles[0],starDetailEntity, AppConstants.TYPE_CONTENT_TODAY);StarFragment weekFragmet=new StarFragment(titles[1],starDetailEntity, AppConstants.TYPE_CONTENT_WEEK);StarFragment monthFragmet=new StarFragment(titles[2],starDetailEntity, AppConstants.TYPE_CONTENT_MONTH);StarFragment yearFragmet=new StarFragment(titles[3],starDetailEntity, AppConstants.TYPE_CONTENT_YEAR);BaseFragment fragments[]={todatFragmet,weekFragmet,monthFragmet,yearFragmet};

我们定义了一些要使用的fragment,并且使用viewPager展示出来了。由于viewPager自身的缓存机制和预加载机制导致这样的一个问题。

当我们请求接口请求一些数据回来要以后,想要更新某个fragment,但是界面数据总是更新失败。

那么这样的问题据我研究之后要这样来解决:

原理就是把就旧的fragment去除掉,换成新的fragment就OK了。

具体实现方法为重写adapter的 instantiateItem()方法。

@Overridepublic Object instantiateItem(ViewGroup container, int position) {//得到缓存的fragmentFragment fragment= (Fragment) super.instantiateItem(container, position);//获取到tagString fragmentTag=fragment.getTag();if (fragmentsUpdateFlag[position % fragmentsUpdateFlag.length]){//如果这个fragment需要更新android.support.v4.app.FragmentTransaction ft=fm.beginTransaction();//移除旧的fragment
                ft.remove(fragment);//换成新的fragmentfragment = fragments[position % fragments.length];//添加新fragment时必须用前面获得的tag,这点很重要ft.add(container.getId(), fragment, fragmentTag ==null? fragment.getClass().getName()+position : fragmentTag);ft.attach(fragment);ft.commit();//复位更新标志fragmentsUpdateFlag[position % fragmentsUpdateFlag.length] = false;}else{fragment = fragments[position];}return fragment;}

下面贴出这个activity的全部的代码以供自己查阅:

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.Log;
import android.view.ViewGroup;
import com.bingo.cqtimelottery.R;
import com.bingo.cqtimelottery.api.ApiService;
import com.bingo.cqtimelottery.api.RetrofitManager;
import com.bingo.cqtimelottery.base.BaseActivity;
import com.bingo.cqtimelottery.base.BaseFragment;
import com.bingo.cqtimelottery.constants.ApiConstant;
import com.bingo.cqtimelottery.constants.AppConstants;
import com.bingo.cqtimelottery.starfortune.entity.StarDetailEntity;
import com.bingo.cqtimelottery.util.DateUtil;
import java.util.HashMap;
import java.util.Map;
import butterknife.BindView;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;public class StarFortuneDetailActivity extends BaseActivity {@BindView(R.id.tabLayout)TabLayout mTabLayout;@BindView(R.id.viewPager)ViewPager mViewPager;private String titles[] = new String[]{"今天", "这周", "这月", "今年"};boolean[] fragmentsUpdateFlag = {false, false, false, false};StarFragment todatFragmet = new StarFragment(titles[0], starDetailEntity, AppConstants.TYPE_CONTENT_TODAY);StarFragment weekFragmet = new StarFragment(titles[1], starDetailEntity, AppConstants.TYPE_CONTENT_WEEK);StarFragment monthFragmet = new StarFragment(titles[2], starDetailEntity, AppConstants.TYPE_CONTENT_MONTH);StarFragment yearFragmet = new StarFragment(titles[3], starDetailEntity, AppConstants.TYPE_CONTENT_YEAR);BaseFragment fragments[] = {todatFragmet, weekFragmet, monthFragmet, yearFragmet};private String starName;private String starId;public static StarDetailEntity starDetailEntity;StarPagerFragmentAdapter mainAdapter;private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);if (msg.arg1 == 100) {fragments[0] = new StarFragment(titles[0], starDetailEntity, AppConstants.TYPE_CONTENT_TODAY);fragmentsUpdateFlag[0] = true;mainAdapter.notifyDataSetChanged();}}};public static StarDetailEntity getStarDetailEntity() {return starDetailEntity;}public static void setStarDetailEntity(StarDetailEntity starDetailEntity) {StarFortuneDetailActivity.starDetailEntity = starDetailEntity;}@Overridepublic int getLayoutRes() {return R.layout.activity_star_fortune_detail;}@Overridepublic void onCreateActivity(@Nullable Bundle savedInstanceState) {Bundle bundle = getIntent().getExtras();starName = bundle.getString("starName");starId = bundle.getString("starId");initToolbar(starName);initAdapter();getStarDetailInfo(starId);}private void initAdapter() {mainAdapter = new StarPagerFragmentAdapter(getSupportFragmentManager(), fragments, titles);mViewPager.setAdapter(mainAdapter);mTabLayout.setupWithViewPager(mViewPager);mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {// arg0 :当前页面,及你点击滑动的页面;arg1:当前页面偏移的百分比;arg2:当前页面偏移的像素位置
            }@Overridepublic void onPageSelected(int position) {// arg0是当前选中的页面的Positionswitch (position) {case 0: //今天break;}}@Overridepublic void onPageScrollStateChanged(int state) {//arg0 ==1的时表示正在滑动,arg0==2的时表示滑动完毕了,arg0==0的时表示什么都没做。
}});}/*** 请求网络数据* @param lotteryid*/private void getStarDetailInfo(String lotteryid) {showLoading();Map<String, String> map = new HashMap<>();map.put("astroid", lotteryid);map.put("date", DateUtil.formateDateString().substring(0, 10));map.put("appkey", ApiConstant.API_KEY);RetrofitManager.getInstance().createReq(ApiService.class).loadStarDetailInfo(map).enqueue(new Callback<StarDetailEntity>() {@Overridepublic void onResponse(Call<StarDetailEntity> call, Response<StarDetailEntity> response) {dismissLoading();if (response.body() != null)starDetailEntity = response.body();//使用Handler发送数据跟新UIMessage message = new Message();message.arg1 = 100;mHandler.sendMessage(message);}@Overridepublic void onFailure(Call<StarDetailEntity> call, Throwable t) {}});}private void replaceTodayFragment() {}public class StarPagerFragmentAdapter<T extends Fragment> extends FragmentPagerAdapter {private BaseFragment[] mList;private String[] mTitles;private StarDetailEntity starDetailEntity;private FragmentManager fm;public StarDetailEntity getStarDetailEntity() {return starDetailEntity;}public void setStarDetailEntity(StarDetailEntity starDetailEntity) {this.starDetailEntity = starDetailEntity;}public StarPagerFragmentAdapter(FragmentManager fm, BaseFragment[] list, String[] titles) {super(fm);this.mList = list;this.mTitles = titles;this.fm = fm;}@Overridepublic Fragment getItem(int position) {Fragment fragment = fragments[position % fragments.length];Log.i("zzccbb", "getItem:position=" + position + ",fragment:"+ fragment.getClass().getName() + ",fragment.tag="+ fragment.getTag());return fragments[position % fragments.length];}@Overridepublic int getItemPosition(Object object) {return POSITION_NONE;}@Overridepublic int getCount() {return mList.length;}@Overridepublic CharSequence getPageTitle(int position) {return mTitles == null ? super.getPageTitle(position) : mTitles[position];}@Overridepublic Object instantiateItem(ViewGroup container, int position) {//得到缓存的fragmentFragment fragment = (Fragment) super.instantiateItem(container, position);//获取到tagString fragmentTag = fragment.getTag();if (fragmentsUpdateFlag[position % fragmentsUpdateFlag.length]) {//如果这个fragment需要更新android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();//移除旧的fragment
                ft.remove(fragment);//换成新的fragmentfragment = fragments[position % fragments.length];//添加新fragment时必须用前面获得的tag,这点很重要ft.add(container.getId(), fragment, fragmentTag == null ? fragment.getClass().getName() + position : fragmentTag);ft.attach(fragment);ft.commit();//复位更新标志fragmentsUpdateFlag[position % fragmentsUpdateFlag.length] = false;}else{            fragment = fragments[position];

          }
        return fragment;     }   } }

转载于:https://www.cnblogs.com/zhang-cb/p/7581187.html

TabLayout+ViewPager更新fragment的ui数据相关推荐

  1. ViewPager+Fragment刷新更新Fragment

    需求如下:顶部UI(这里随便写的),一些标签(服务器给的,这里写死),切换标签展示不同内容,内容分页展示,要求可以下拉刷新(重要页面,没刷新太low了吧),刷新之后还停在当前标签下面,但是内容也要刷新 ...

  2. TabLayout+Viewpager+Fragment实现分页滚动

    效果如上,顶部标签滚动底下的页面也跟着滚动 灰色的标签只是一个recyclerview装起来的 这里用TabLayout+Viewpager+Fragment实现 先看布局 <?xml vers ...

  3. Tablayout+ViewPager+Fragment 实现页面切换

    项目也快上线了,就来总结下Tablayout+ViewPager+Fragment 的使用啦 主activity public class DoSomethingAct extends BaseAct ...

  4. TabLayout+ViewPager+Fragment实现切页展示

    写在前面 目前大多数的APP都采用的是几个Tab标签以及多个界面滑动的形式来提供多层次的交互体验,最为常用的做法就是采用TabLayout+ViewPager+Fragment的方式,最近在公司项目中 ...

  5. Android实现一个简易的新闻列表APP(TabLayout+ViewPager+Fragment)

    Android实现一个简易的新闻列表APP(TabLayout+ViewPager+Fragment) 文章目录 Android实现一个简易的新闻列表APP(TabLayout+ViewPager+F ...

  6. 使用TabLayout+ViewPager+Fragment实现切页展示

    使用TabLayout+ViewPager+Fragment是比较常见的实现切页展示的方式,本例是在fragment中实现主要代码 步骤: 1,定义TabLayout和ViewPager的布局 2,实 ...

  7. TabLayout+ViewPager+Fragment中Fragment的可见和不可见问题

    场景 TabLayout+ViewPager+Fragment的使用过程中需要判断Fragment是否对用户可见,监听Fragment由不可见变为可见的事件 解决方案 重写Fragment的setUs ...

  8. TabLayout+ViewPager+Fragment(内部:TabLayout+ViewPager+ Fragment)需要注意!!

    之前面试的时候,被面试官问道ViewPager嵌套ViewPager怎么处理的.我还一直在回答用最外层的vp的onInterceptTouchEvent来处理怎样怎样(注意是代码没有写过,就这样说了. ...

  9. ViewPager、Fragment和TabLayout实现切页效果

    文章目录 ViewPager.Fragment和TabLayout实现切页效果 ViewPager.Fragment和TabLayout实现切页效果 不会上传动图,心里哭唧唧.但是是完整代码!新建一个 ...

最新文章

  1. cpu高 thread vm_阿里大佬总结,Java高并发必读!
  2. S3C6410的IROM启动模式
  3. sklearn 神经网络_sklearn中的数据预处理和特征工程
  4. pfSense book之静态路由
  5. web站点放入html页面,HTML
  6. java gui框架_推荐!程序员整理的Java资源大全
  7. 三联《少年》创刊,各领域佼佼者畅言新知,帮少年建立思维素养体系!
  8. 二级vb笔试题库__全国计算机等级考试,2012年9月全国计算机二级VB笔试标准预测试卷试题六...
  9. Vue商品添加到购物车
  10. CRY ENGINE 3 引擎详解
  11. 如何卸载mysql教程(按照步骤可完全卸载)
  12. ScreenToGif2.19.3中文版GIF录制工具
  13. 跨终端游戏平台:腾讯START云游戏 for Mac
  14. linux 韦恩图两个,在线&在R中绘制韦恩图的几种方法 和 一些漂亮的venn图
  15. 微信小程序—修改日期
  16. linux组态文件,嵌入式Linux组态软件实时数据库的设计
  17. 重庆SEO优化:网站通过SEO优化会有哪些好处以及【SEO优化】 深度了解蜘蛛spider抓取原理-专业SEO技术教程
  18. [句子成分] 三、宾语
  19. 二氧化钛TiO2纳米粒子(尺寸80nm-800nm可调节)的高清电镜图
  20. 中科院自动化研究所人工智能专业,使用/教程/实例

热门文章

  1. thinkphp联查
  2. 什么是Asp.net Core?和 .net core有什么区别?
  3. 快速使用wordpress
  4. 探知 浏览器并发请求个数
  5. BZOJ 1009 [HNOI2008]GT考试
  6. hdu 4639 2013多校第四场 hehe Fibonacci 数列,组合计数,字符串处理
  7. 空间复杂度分段分段有序数组合并成有序(空间复杂度为O(1))
  8. 安装 Ruby 和 Rails 开发环境
  9. SOAP和HTTP 两种基本传输协议
  10. java实现zip与unzip