Android两个tab吸顶,Android scrollView和viewpager嵌套 指示器吸顶 根据viewpager每

Android scrollView和viewpager嵌套 指示器吸顶 根据viewpager每

Android scrollView和viewpager嵌套 指示器吸顶 根据viewpager每个页面的内容适配高度

这几天 朋友问我了个问题  有个特别的需求  页面如下

i1z2spne13r.gif

就是当viewpager里面的当前页面内容足够多的时候  要去能滑上去 并且指示器吸顶  但是当内容不多的时候  能滑到哪就停在哪  当时第一反应是用coordinatelayout  结果不行 内容少的时候  也直接滑到顶部了

activity的xml文件

后来就直接用scrollView包裹来实现了 自定义scrollView实现滚动监听 用来实现指示器吸顶效果

public classMyScrollview extendsScrollView {

privateScrollViewListener scrollViewListener= null;publicMyScrollview(Context context) {

super(context);}

publicMyScrollview(Context context,AttributeSet attrs) {

super(context,attrs);}

publicMyScrollview(Context context,AttributeSet attrs, intdefStyleAttr) {

super(context,attrs,defStyleAttr);}

public voidsetScrollViewListener(ScrollViewListener scrollViewListener) {

this.scrollViewListener= scrollViewListener;}

@Overrideprotected voidonScrollChanged(intl, intt, intoldl, intoldt) {

super.onScrollChanged(l,t,oldl,oldt);if(scrollViewListener!= null) {

scrollViewListener.onScrollChanged(this,l,t,oldl,oldt);}

}

public interfaceScrollViewListener {

voidonScrollChanged(MyScrollview scrollView, intl, intt, intoldl, intoldt);}

}

在activity里面设置监听

scroll.setScrollViewListener(newMyScrollview.ScrollViewListener() {

@Overridepublic voidonScrollChanged(MyScrollview scrollView, intl, intt, intoldl, intoldt) {

if(t >iv.getHeight() && mTabLayout.getParent() == layout) {

layout.removeView(mTabLayout);rl_layout.addView(mTabLayout);} else if(t < iv.getHeight() && mTabLayout.getParent() == rl_layout) {

rl_layout.removeView(mTabLayout);layout.addView(mTabLayout);}

}

});

然后就是实现viewpager的每个页面的内容高度适配了  从写viewpager

public classCustomViewPager extendsViewPager {

private intcurrent;private intheight= 0;/*** 保存position与对于的View*/privateHashMap mChildrenViews= newLinkedHashMap();private booleanscrollble= true;publicCustomViewPager(Context context) {

super(context);}

publicCustomViewPager(Context context,AttributeSet attrs) {

super(context,attrs);}

@Overrideprotected voidonMeasure(intwidthMeasureSpec, intheightMeasureSpec) {

if(mChildrenViews.size() > current) {

View child = mChildrenViews.get(current);if(child != null) {

child.measure(widthMeasureSpec,MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED));height= child.getMeasuredHeight();}

}

heightMeasureSpec = MeasureSpec.makeMeasureSpec(height,MeasureSpec.EXACTLY);super.onMeasure(widthMeasureSpec,heightMeasureSpec);}

public voidresetHeight(intcurrent) {

this.current= current;if(mChildrenViews.size() > current) {

LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams();if(layoutParams == null) {

layoutParams = newLinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,height);} else{

layoutParams.height= height;}

setLayoutParams(layoutParams);}

}

/*** 保存position与对于的View*/public voidsetObjectForPosition(View view, intposition) {

mChildrenViews.put(position,view);}

@Overridepublic booleanonTouchEvent(MotionEvent ev) {

if(!scrollble) {

return true;}

return super.onTouchEvent(ev);}

public booleanisScrollble() {

returnscrollble;}

public voidsetScrollble(booleanscrollble) {

this.scrollble= scrollble;}

}用法是在每个fragment 的onCreatView里面添加一行代码就行

c71945cf4706f1c97b35a7d02b98ec28.png

然后在viewpager所在的activity里面设置监听  就可以了

mViewPager.setOnPageChangeListener(newViewPager.OnPageChangeListener() {

@Overridepublic voidonPageScrolled(intposition, floatpositionOffset, intpositionOffsetPixels) {

}

@Overridepublic voidonPageSelected(intposition) {

mViewPager.resetHeight(position);}

@Overridepublic voidonPageScrollStateChanged(intstate) {

}

});

下面是整个activity的代码

packagecom.example.wenlaisu.myapplication;importandroid.os.Bundle;importandroid.support.design.widget.TabLayout;importandroid.support.v4.app.Fragment;importandroid.support.v4.view.ViewPager;importandroid.support.v7.app.AppCompatActivity;importandroid.widget.ImageView;importandroid.widget.LinearLayout;importandroid.widget.RelativeLayout;importjava.util.ArrayList;importjava.util.List;/*** Created by wenlaisu on 2018/4/12.*/public classViewPagerSample extendsAppCompatActivity {

CustomViewPager mViewPager;List mFragments;String[] mTitles= newString[]{

"主页","微博","相册"};privateTabLayout mTabLayout;privateMyScrollview scroll;privateLinearLayout layout;privateRelativeLayout rl_layout;privateImageView iv;@Overrideprotected voidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.activity_third);// 第一步,初始化ViewPager和TabLayoutmViewPager= (CustomViewPager) findViewById(R.id.viewpager);mTabLayout= (TabLayout) findViewById(R.id.tabs);layout= (LinearLayout) findViewById(R.id.layout);rl_layout= (RelativeLayout) findViewById(R.id.rl_layout);scroll= (MyScrollview) findViewById(R.id.scroll);iv= (ImageView) findViewById(R.id.iv);setupViewPager();}

private voidsetupViewPager() {

mFragments= newArrayList<>();ListFragment listFragment = newListFragment(mViewPager,0);ListFragment2 listFragment2 = newListFragment2(mViewPager,1);ListFragment3 listFragment3 = newListFragment3(mViewPager,2);mFragments.add(listFragment);mFragments.add(listFragment2);mFragments.add(listFragment3);// 第二步:为ViewPager设置适配器BaseFragmentAdapter adapter =

newBaseFragmentAdapter(getSupportFragmentManager(),mFragments,mTitles);mViewPager.setAdapter(adapter);// 第三步:将ViewPager与TableLayout 绑定在一起mTabLayout.setupWithViewPager(mViewPager);mViewPager.setOnPageChangeListener(newViewPager.OnPageChangeListener() {

@Overridepublic voidonPageScrolled(intposition, floatpositionOffset, intpositionOffsetPixels) {

}

@Overridepublic voidonPageSelected(intposition) {

mViewPager.resetHeight(position);}

@Overridepublic voidonPageScrollStateChanged(intstate) {

}

});scroll.setScrollViewListener(newMyScrollview.ScrollViewListener() {

@Overridepublic voidonScrollChanged(MyScrollview scrollView, intl, intt, intoldl, intoldt) {

if(t >iv.getHeight() && mTabLayout.getParent() == layout) {

layout.removeView(mTabLayout);rl_layout.addView(mTabLayout);} else if(t < iv.getHeight() && mTabLayout.getParent() == rl_layout) {

rl_layout.removeView(mTabLayout);layout.addView(mTabLayout);}

}

});}

}

就可以了

demo的github地址

Android scrollView和viewpager嵌套 指示器吸顶 根据viewpager每相关教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340740.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html5input输入框设置无边框_芯片充电两大改变,无看点的iPad8,上手体验发现并不简单!...

前不久&#xff0c;苹果召开了秋季新品发布会&#xff0c;但与以往不同的是&#xff0c;往年本该成为“配角”的iPad&#xff0c;没想到此次成为了主角之一&#xff0c;面对着外观不变仅升级芯片新发布的iPad 8&#xff0c;大家好像没有过多的激情&#xff0c;”旧瓶装新酒“的…

android系统三防机,这才是真正给老人设计的智能手机:三防+安卓系统+超大音量,AGM H2...

原标题&#xff1a;这才是真正给老人设计的智能手机&#xff1a;三防安卓系统超大音量&#xff0c;AGM H2在这个互联网时代&#xff0c;很多智能手机厂商&#xff0c;都是在硬件配置上面进行比拼&#xff0c;包括但是不限于处理器的升级&#xff0c;摄像头的升级&#xff0c;散…

spring aop 注释_使用Spring AOP,自定义注释和反射为您的应用程序审核基础结构

spring aop 注释下一篇文章将演示如何使用Spring AOP和注释编写简单的审计。 审核机制将是干净&#xff0c;高效且易于维护的&#xff08;和Kewwl&#xff01;&#xff09;。 我将在用户管理系统上演示我的示例&#xff08;假设您具有反射和AOP的一般知识&#xff09;。 我们…

springboot 打包_springboot打包-体积太大怎么办

springcloud项目打包动辄100多兆&#xff0c;在文件上传部署的时候非常耗时&#xff0c;多数情况下是毫无意义的耗时&#xff0c;因为依赖包很多情况下不需要改变&#xff0c;只是修改了业务逻辑&#xff0c;那么每次打包上传的时间都浪费了&#xff0c;尤其在开发环境下&#…

.vue文件_Spring Boot 2.x(十六):玩转vue文件上传

为什么使用Vue-Simple-Uploader 最近用到了Vue Spring Boot来完成文件上传的操作&#xff0c;踩了一些坑&#xff0c;对比了一些Vue的组件&#xff0c;发现了一个很好用的组件——Vue-Simple-Uploader&#xff0c;先附上gayhub的&#xff0c;再说说为什么选用这个组件&#xf…

成为Java流专家–第2部分:中级操作

就像魔术棒一样&#xff0c;中间操作将一个Stream转换为另一个Stream。 这些操作可以无穷无尽的方式组合在一起&#xff0c;以可读有效的方式执行从简单到高度复杂的任务。 本文是五分之二&#xff0c;其中还有一个GitHub存储库&#xff0c;其中包含每个单元的说明和练习。 第…

HTML怎么在li中加select标签,自定义UL LI选择框似乎在其他HTML元素后面

我似乎无法弄清楚为什么我的自定义UL LI选择框出现在其他HTML元素后面。你如何解决这个问题&#xff0c;当用户点击选择框时&#xff0c;它会出现在其他页面元素的顶部&#xff1f;这里是手头的问题的一个画面&#xff1a; 下面是一个描绘所期望的结果&#xff1a; 这里是有问题…

java初学者面试_Java面试的前50个问题,面向初学者和经验丰富的程序员

java初学者面试您可以参加任何Java面试&#xff0c;无论是大四还是中级&#xff0c;经验或新来的人&#xff0c;一定会看到线​​程&#xff0c;并发和多线程中的几个问题。 实际上&#xff0c;这种内置的并发支持是Java编程语言的最强优势之一&#xff0c;并帮助它在企业界和程…

convert.todatetime指定日期格式_SQL基础知识V2——常用日期函数

点击上方SQL数据库开发&#xff0c;关注获取SQL视频教程SQL专栏SQL数据库基础知识汇总SQL数据库高级知识汇总日期函数是数据库中经常需要使用到的&#xff0c;本期将常用的几个日期函数给小伙伴做详细的介绍。GETDATE()GETDATE()函数用于返回当前数据库系统的日期和时间&#x…

恢复html的初始选定状态,Adobe Photoshop

了解如何在 Adobe Photoshop 中使用“还原/重做”命令和“历史记录”面板来控制图像的状态。通过使用“还原/重做”命令和“历史记录”面板&#xff0c;您可以轻松地控制图像的状态。使用还原或重做命令Photoshop CC 20.0(2018 年 10 月版)中的更新功能从 Photoshop CC 2018 年…

classcastexception异常_优雅的异常处理

代码正常运行不会出问题&#xff0c;但是遇到意外&#xff0c;参数变量&#xff0c;不符合要求&#xff0c;发生意外&#xff0c;代码终止运行代码中的异常处理好了&#xff0c;代码就可以顺利的继续运行&#xff01;3.3 最近我们遇到过的异常System.out.println(1/0);//java.l…

Spring Boot微服务,Docker和Kubernetes研讨会–第3部分

在之前的文章中&#xff0c;我们为使用Docker和Spring Boot的订单管理系统构建了一些微服务&#xff08;订单服务&#xff0c;产品服务&#xff0c;客户服务&#xff09;。 我们使用Netflix库来管理&#xff0c;发现和平衡微服务。 管理这些微服务及其多个容器可能会有些棘手&…

2021年茂名市高考成绩查询,2021年茂名高考最高分多少分,历年茂名高考状元

2021年茂名高考成绩公布时&#xff0c;茂名高考成绩最高分受到很多网友关注&#xff0c;具体2021年茂名高考最高分多少分&#xff0c;考生可以在聚志愿网站查询具体位次排名&#xff0c;报考茂名高考一分一段表位次排名、同分数人数、位次查询等相关数据。本期文章小编主要为大…

客制化键盘键位修改_可以用很漂亮形容的一把键盘,差一步就完美

内置钢板是轴体固定需要也是机械键盘的标志&#xff0c;钢板除了可以带来极其稳定的固定效果也成就了机械键盘扎实的手感&#xff0c;同时是机械键盘分量感的主要来源&#xff0c;给人一种结实感&#xff0c;这是薄膜键帽所不具备的。▲外置钢板在悬浮式结构的键盘上比较常见&a…

adb 切换默认桌面_公告 | 武林外传手游官方服务器全面开放桌面版体验

为了更好的优化玩家游戏体验&#xff0c;应广大客官要求&#xff0c;《武林外传手游》全新桌面版今日上线&#xff0c;iOS及安卓服务器均可在电脑上畅玩《武林外传手游》啦&#xff01;大屏画面更加细腻绚丽&#xff0c;预设键位助你畅游江湖&#xff0c;欢迎广大玩家下载体验&…

java获取word书签表格数据_Python读取word文档里面的表格数据

更多精彩&#xff0c;请点击上方蓝字关注我们&#xff01;我们常见的办公数据通常可以分为结构化数据与非结构化数据&#xff0c;比如常见的word, ppt, excel。前两者存储的是非结构化数据&#xff0c;excel存储的是结构化数据。从事数据统计或分析的工作或多或少都会从excel获…

abb智能控制系统_ABB助力国网冀北电力打造虚拟电厂

近日&#xff0c;ABB为国网冀北电力有限公司定制了智能配电计量与协调控制解决方案&#xff0c;对其虚拟电厂进行远程电能管理&#xff0c;实现高峰调节和负载转移&#xff0c;提高电力系统效率&#xff0c;保持供电稳定性。虚拟电厂是通过分布式电力管理系统将电网中发电端(尤…

通过通用数据访问扩展AWS生态系统

Amazon Web Services&#xff08;AWS&#xff09;可帮助组织托管和管理其数据流程&#xff0c;例如构建数据可视化和执行ETL任务。 在CData&#xff0c;我们可以轻松地将AWS Services与异构业务应用程序和分布式数据存储连接起来&#xff0c;以最终帮助企业对其数据进行更全面的…

android官方文档中文版_Now in Android:01 - 如何掌握最新的 Android 技术?

每隔几天我都会通过 Android Developers 的油管官方频道&#xff0c;来了解一下最近 Android 发布了哪些有趣的新技术&#xff0c;最近发现官方推出了一个新的系列视频叫做&#xff1a;Now in Android&#xff0c;目前更新了 4 期&#xff0c;我觉得这个系列蛮有趣的&#xff0…

c++ 反射_固体火箭发动机黏接壳体超声C扫描检测系统研制与应用

某固体火箭发动机燃烧室采用壳体/绝热层/包覆层/推进剂的多界面结构形式&#xff0c;其中绝热层采用玻璃纤维缠绕成型后与钢质旋压壳体胶接而成。在胶接过程中&#xff0c;若存在壳体内部多余物清理不干净、绝热层与壳体配合不严、胶层内部气体未排净等情况&#xff0c;黏接层易…