Android开发中经常用到ViewPager+Fragment+Adapter的场景,一般每个Fragment控制自己的刷新,但是如果想要刷新整个ViewPager怎么做呢?...不由得有些好奇,随跟踪了部分源码,简单整理如下: ViewPager+FragmentPagerAdapter为何不能通过setAdapter做到整体刷新 第二次设置PagerAdapter的时候,首先会将原来的...ViewPager+FragementStatePagerAdapter可以通过setAdapter做到整体刷新 同样先看一下FragementStatePagerAdapter的destroyItem...,在自己的Fragment缓存列表中取不到,就新建。...作者:看书的小蜗牛 原文链接:ViewPager刷新问题原理分析及解决方案(FragmentPagerAdapter+FragementStatePagerAdapter) 仅供参考,欢迎指正
模板代码 - 列表和下拉刷新 手机应用一个常见的界面模式就是:顶部的ActionBar + TabStrip导航,中间的ListView,可以下拉刷新或者是底部的加载更多。...//关联viewPager和FragmentStatePagerAdapter实例 viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager...假设我们使用ListView显示一个下载应用的列表界面,在ListView的底部显示“加载更多”这样的按钮,那么就是让ListView同时显示2种类型的条目。 ...为显示的“应用信息”列表条目定义AppInfoViewHolder,它包含一个name和icon,布局文件item_appinfo是简单的ImageView和TextView,其ViewHolder定义如下...}); } }.start(); } } ListView可以添加多种类型的显示条目,常见的有顶部的轮播图片,顶部下拉刷新
,没错,这里我们就是这样干的,因为只有一个刷新,却有三个页面,所以这里还有一个需要注意的地方就是刷新之后三个页面的数据分配问题,待会我们再来讲这个问题。...布局写完之后,我们来完成viewpager和Fragment的结合。...我们的ViewPager需要一个FragmentPagerAdapter来填充,在adapter中我们需要注意的是Fragment一定要写成员变量,切记不可在getItem方法中返回的时候直接new一个...,刷新的时候我们还需要注意一点,就是当你把toolbar里面的内容(也就是整个头部)顶上去之后,再下拉,它会立马进行刷新,不会等到你把toolbar中的内容拉到正常状态再进行刷新,详细解决方案请参考 CoordinatorLayout...首先,在Activity中,我们可以根据ViewPager.getCurrentItem()方法来判断我们处于哪个fragment中,然后我们在Fragment中写set方法: public void
最近的项目使用到了ViewPager + Fragment的模式,要求在每次Fragment获取显示的时候来刷新数据,该项目下ViewPager有5个子fragment,在onCreateView及fragment...的setUserVisibleHint(bool isVisibleToUser)中的isVisibleToUser为true的时候刷新数据的时候出现数据多次刷新的情况,因此对ViewPage + Fragment...项目布局最顶层5个button,主体是ViewPager+fragment, 可以通过点击button直接跳转到对应的fragment,也可以通过左右滑动来进行相邻跳转。 ?...fragment如何变化,首先被选中的fragment会调用参数为true的setUserVisibleHint方法,被选中的fragment与相邻的fragment的状态肯定是onCreate的状态(如果未create
Context context){ mHandler=new Handler(); this.viewPager=new ViewPager(context); this.viewPager.setOffscreenPageLimit...mData.size();获取正确位置,再返回正确的View,假如是单纯的图片就返回ImageView而已,通过回调mCreateView.createView()获取View,回调updateView()刷新...当ViewPage每滑动一次都会调用changeIndicator()方法,这里先遍历把所有的View都设为未选择状态,再把选中的ImageView设为选中的图片就行了,每什么说的。...在通过 (numoriginMargin)+originMarginpositionOffset拿到滑动的距离,调invalidate()方法刷新。...刷新是会回调:dispatchDraw(Canvas canvas)方法。
notifyItem***方法,从而动态刷新某项视图; 3、除了当前页,也支持展示左右两页的部分区域; 4、支持在翻页过程中展示自定义的切换动画; 虽然ViewPager2增加了这么棒的功能,但它用起来非常简单...mContext; // 声明一个上下文对象 private List mGoodsList = new ArrayList(); // 声明一个商品列表... public TextView tv_desc; // 声明列表项描述的文本视图 public ItemHolder(View v) { super...FragmentStateAdapter { private List mGoodsList = new ArrayList(); // 声明一个商品列表... // 碎片页适配器的构造方法,传入碎片管理器与商品信息列表 public MobilePagerAdapter(FragmentActivity fa, List<GoodsInfo
[1].既然ViewPager和Fragment都总结完了,那就插一个材料设计中的TabLayout控件吧,这三者关系挺好 [2].TabLayout在上面就是曾经的ViewPager指示器,想当年都是自己封装来用...[3].引入包:implementation 'com.android.support:design:26.1.0' [4].在此之前,你应该知道ViewPager和Fragment的组合使用,如果不清楚...,可以看一下:Fragment与ViewPager结合 ?...mTabTl.setTabMode(TabLayout.MODE_SCROLLABLE); mTabTl.setBackgroundColor(Color.GRAY); //设置颜色:(未选中的...集合增加 tabFragments.add(V01_ContentV4Fragment.newInstance(addName)); //刷新
} /** * 设置指示器图片,在setData之前调用 * * @param select 选中时的图片 * @param unselect 未选中时的图片...if (isWheel) { handler.postDelayed(runnable, delay); } } /** * 刷新数据...,当外部视图更新后,通知刷新数据 */ public void refreshData() { if (mAdapter !...initView() { mCycleViewPager = (CycleViewPager) findViewById(R.id.cycle_view); //设置选中和未选中时的图片...(这段时间忙着找工作,就先搁下了,有兴趣的同学可以先尝试下。)
PagerAdapter是ViewPager的适配器类,为ViewPager提供界面。...getItemPosition(Object object): object是Fragment对象,如果返回POSITION_UNCHANGED,则表示当前Fragment不刷新,如果返回POSITION_NONE...懒加载 懒加载主要用于ViewPager且每页是Fragment的情况,场景为微信主界面,底部有4个tab,当滑到另一个tab时,先显示”正在加载”,过一会才会显示正常界面。...逻辑为:当用户滑到另一个界面,首先会显示正在加载,等数据加载完毕后(这里用睡眠1秒钟代替)显示正常界面。...mIsInited) { //异步初始化,在初始化后显示正常UI loadData(); } } private void
而筛选只应用在主列表,不会影响已经选择的item列表。 那时我明白了必须千方百计把Vitaly的多选概念设计实现出来;所以我几乎立即就开始了编写这个控件的工作。...1478063387383413.gif 实现 这个控件有一个带了两个RecyclerView的ViewPager,我们可以通过重写getPageWidth方法返回一个0到1之间的浮点数来让ViewPager...一个具有两个页面的ViewPager,每个页面包含一个RecyclerView。未被选择的item在左边的列表。选中的item在右边的列表。...RecyclerView删除了这个view,所以这会导致错误: sourceRecycler.layoutManager.removeViewAt(position) 技术栈 我们选择Kotlin语言来做这个工作...3.接下来,为未选中的列表和选中列表创建两个adapter。
ViewPager2+Fragment操作笔记 ViewPager2简介 ViewPager2官网介绍 ViewPager2官网Samples 距离ViewPager2正式版的发布已经一年多了,目前ViewPager...; 支持DiffUitl,可以实现局部刷新; 支持RTL(right-to-left),对于一些有出海需求的APP非常有用; 支持ItemDecorator,搭配PageTransformer实现炫酷的跳转动画...实际操作效果 上滑吸顶+标题页面左右滑动+横滑和竖滑列表+标题页面数据和数量更新 上滑吸顶 CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout...左右滑动 ViewPager2+TabLayout+Fragment 横滑和竖滑列表 RecycleView+NestedScrollableHost 标题页面数据和数量 TabLayoutMediator...更新数据的时候遇到的崩溃: Fragment already added 重写getItemId方法,该方法返回的值与数据有关而不是与数据在列表中的索引有关。
京东首页 这是京东的首页,忽略顶部和顶部,大致理解视图结构就是:最外层为多布局的RecyclerView,最后一个item是tabLayout+ViewPager,ViewPager的每个fragment...所以按照正常处理滑动冲突的思路处理--当tab没到顶部时,parent拦截事件,tab到顶部时 parent就不拦截事件,但是由于手指没抬起来,所以这一事件序列还是继续给parent,不会到内部RecyclerView...但其实在真实应用中,可能 头部 和 列表 的数据来自不同的接口,当列表的数据请求失败时要展示缺省图,但头部还是会展示。这时头部和列表 分开实现 是比较好的选择。 这里给出解决方案: <?...2.3 NestedScrollingParent2LayoutImpl3的实现原理 代码如下 /** * 处理RecyclerView 套viewPager, viewPager内的fragment...(未消耗的距离) * @param dyUnconsumed 垂直方向嵌套滑动的子View未滑动的距离(未消耗的距离) * @param type 滑动类型,ViewCompat.TYPE_NON_TOUCH
这期要聊的是那么躺在坑里的需求,想想这一路走来,本人还能正常的行走于人世,真是好感动呢,感谢产品和QA的不杀之恩。 1、TextView的由于Span导致省略号显示不正常问题。...5、ViewPager嵌套RecyclerView还有轮播图的手势冲突,参考:linkagescroll。...7、ViewPager的实时数据刷新。 8、CardView 慎用,因为在某些低版本的机器上会有白带,需要的话可以用shape实现圆角。 9、图片压缩安利。...1、之前分享过一篇文章《文本编辑和显示(emoji表情,@某人、链接高亮点击)》,这里用到的Spanable替代String用于TextView的显示,一般情况下是没什么问题的,但是如果你需要在列表中或者详情中做省略号处理...ThemeAlpha" parent="AppTheme"> true 5、更新ViewPager
AppBarLayout的滚动,利用topMargin实现被“顶上去”的效果 拆分完毕,接下来就是实现了 实现 Tab的悬浮效果 利用CoordinatorLayout、AppBarLayout、TabLayout、ViewPager...Android 详细分析AppBarLayout的五种ScrollFlags (CoordinatorLayout、AppBarLayout的详细用法我就不多说了) 然后,只要在Java代码中为ViewPager...添加几个列表Fragment就能看到以下的效果(注意:列表不可以是ListView,需要用RecyclerView) ?..."#FFFFFF"/> ViewPager...具体的解决方案 问题:如果你在想要刷新功能,在CoordinatorLayout外面套了一个SwipeRefreshLayout,一不小心就触发了刷新~~(自己体会) 解决方案:这个问题可以通过对AppBarLayout
| 导语 苹果在iOS 7的时候就引入了卡片列表进行多任务切换,往上滑动就可以移除掉某个app,到了最新的iOS 13,其多任务列表也是在这种卡片列表样式的基础上进行了优化;Android阵营的华为,小米等厂商也是陆续地引入这种多任务列表样式...那怎样在Android上实现一个iOS多任务列表效果呢? 一. 实现效果 先看看iOS的多任务列表长啥样。 1-min.gif 再来看看华为的多任务列表。...基于ViewPager现有能力,要仿照iOS多任务列表效果,还需要修改以下几点: 1)ViewPager默认的item排列是横向顺序排列,需要变成卡片叠加排列 2)ViewPager...卡片宽高 我们知道,正常情况我们在Fragment返回的View是铺满ViewPager宽高的,上下的空隙我们可以设置padding来实现,左右的是不是也可以设置padding来实现呢? ...总结 最后总结一下,本篇介绍了如何基于ViewPager,实现了一个类似iOS多任务列表效果,主要目的在于验证方案的可行性,即如何在已有控件的基础上快速复用来实现我们要的效果,虽然效果实现出来了,但对比
提供了 Section 的概念,用来将列表分块。...QMUIItemViewsAdapter 一个带 cache 功能的“列表型数据-View”的适配器,适用于自定义 View 需要显示重复单元 ListView 的情景,cache 功能主要是保证在需要多次刷新数据或布局的情况下...QMUIPullRefreshLayout 下拉刷新控件。支持自定义 RefreshView(表示正在刷新的 View),触发刷新的位置等特性。...可以通过 setupWithViewPager(ViewPager) 方法与 ViewPager 绑定。...配置主题 把项目的 theme 的 parent 指向 QMUI.Compat,至此,QMUI 可以正常工作。 3.
许多程序员有这样的疑问:现有的知识能满足工作需要了,为什么还要费劲去学习Material Design?...好了,让我们集中注意力开始学习吧~ 本文要点 保持ViewPager中Fragment的状态。 快速绑定已有数据的TabLayout与ViewPager。...一个奇怪的需求 有这样一个需求: MainActivity里有一个ViewPager,ViewPager里面有三个Fragment,各个Fragment标题栏是不一样。...第一个Fragment需要有一个带菜单的沉浸式头部视图(带图片)以及一个ViewPager,该ViewPager包含两个子Fragment。...子Fragment内包含带下拉刷新的RecyclerView,该RecyclerView滑动的时候,父Fragment里的沉浸式头部也要跟着收起或拉伸。
特殊情况未考虑:忽略了ViewPager+Fragment延时加载这些常见而复杂的情况,这些情况会造成实际测速时间非常不准。...测速定义 我们把页面加载流程抽象成一个通用的过程模型:页面初始化 -> 初次渲染完成 -> 网络请求发起 -> 请求完成并刷新页面 -> 二次渲染完成。...,一进来会先请求config接口,然后请求list接口,当list接口回来后展示列表数据,那么该页面的初始请求就是config和list接口。...在构造函数中直接调用Java的API来计算时间,之后传入SDK中,而不是直接调用SDK的方法,是为了防止MultiDex注入之前,调用到未注入的Dex中的类。...作者简介 文杰,美团前端Android开发工程师,2016年毕业于天津工业大学,同年加入美团点评到店餐饮事业群,从事商家销售端移动应用开发工作。
我们用常见的下拉刷新控件PullToRefreshLayout来举例子。...实例,PullToRefreshLayout 是一个刷新列表控件,我们通过使用ReplyCommand监听下拉刷新和上拉加载的监听器是这样写的: 我们使用统一的ReplyCommand来处理控件的各种事件...binding-collection-adapter 「binding-collection-adapter」对所有需要adapter的控件进行了封装,比如一些常用的:ListView、RecyclerView、ViewPager...这样我们就绑定好了这个列表控件的多布局逻辑了。一个空数据时候的布局,一个正常返回数据时候的布局。...(); 当我们网络请求返回的时候,我们在数据回调里,通过对数据类型的处理,进行ItemViewModel的构造,最后只需要将构造好的对象一个个添加到这个ObservableList数据结构中去,界面的刷新工作都在对应的
中)可以一起滑动,所以很容易想到的办法就是用Scrollview将两者嵌套进去,效果是实现了,但是Scrollview嵌套Viewpager的弊端显而易见!...而第二版即本篇博客并不是为了解决Scrollview嵌套Viewpager的问题,而是换一种思路去实现! 布局结构图,很简单,就两层: image.png 列表一起滑动的效果啊?!...android:layout_height="40dp" android:gravity="center" android:text="下拉刷新...new Handler().postDelayed(() -> { tv_refresh_state.setText("下拉刷新
领取专属 10元无门槛券
手把手带您无忧上云