Android两个tab吸顶,Android scrollView和viewpager嵌套 指示器吸顶 根据viewpager每
Android scrollView和viewpager嵌套 指示器吸顶 根据viewpager每
Android scrollView和viewpager嵌套 指示器吸顶 根据viewpager每个页面的内容适配高度
这几天 朋友问我了个问题 有个特别的需求 页面如下
就是当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里面添加一行代码就行
然后在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每相关教程
Android两个tab吸顶,Android scrollView和viewpager嵌套 指示器吸顶 根据viewpager每相关推荐
- android两种广播注册区别,Android 注册广播的两种方式对比
Android 注册广播的两种方式对比 1.常驻型广播 常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到, 他的注册方式就是在你的应用程序中的AndroidManif ...
- (转载)Android两种Tab分页的方式:TabActivity和ActivityGroup以及Android项目几种常见的应用架构...
在Android里面Tab分页,常用的方法有两种: 一.TabActivity和TabHost的结合 1.主类继承TabActivity public class Tagpage extends Ta ...
- Android两个canvas混合叠加,Android Canvas设置绘画时重叠部分的处理模式【含效果图】...
在Android的PorterDuff.Mode类中列举了他们制定的规则: android.graphics.PorterDuff.Mode.SRC:只绘制源图像 android.graphics.P ...
- android两个活动共用变量,Android:多个Activity共享全局变量
直接看实现方法吧~ 首先新建一个activity用来存放需要共享的全局变量的成员和方法,比如这里我新建一个MyDataActivity: package com.anwensoft.cardvr.ac ...
- android 两个imageview重叠,在android中覆盖两个图像以设置imageview
您可以使用以下代码解决问题或在此处下载演示 创建两个函数来处理每个函数. 首先,绘制画布,并从点(0,0)将图像绘制在彼此之上 单击按钮public void buttonMerge(View vie ...
- android实现评论列表_【Android视图效果】分组列表实现吸顶效果
效果图 效果图 分析 先来分析一下,可以看到这是一个按月份分组的2行图片列表,列表顶部一个悬浮栏,会随着列表滑动而刷新,点击顶部栏,弹出了一个筛选框. 思路 1.列表部分 可以用RecyclerVie ...
- android listview标题置顶,Android仿QQ左滑删除置顶ListView操作
最近闲来无事,于是研究了一下qq的左滑删除效果,尝试着实现了一下,先上效果图: 大致思路原理: - 通过设置margin实现菜单的显示与隐藏 - 监听onTouchEvent,处理滑动事件 上代码 i ...
- android imageview 锯齿,[置顶] android 自定义圆角ImageView以及锯齿的处理
看到很多人开发过程中要使用圆角图片时,解决方法有: 1.重新绘制一张图片 2.通过布局来配置 3.通过重写View来实现 其中1,2在这里就不讲了,重点讲讲方法三的实现. 实现一:通过截取画布一个圆形 ...
- 罗升阳:那两年炼就的Android内功修养
[置顶] 那两年炼就的Android内功修养 原文链接:http://blog.csdn.net/luoshengyang/article/details/8923485 经过两年的时间,终于完成对A ...
最新文章
- 制药行业SAP项目里的那些MES系统
- 数据结构学习笔记4.1--查找节点
- HDU 1853 MCMF
- 英语听力里面的religion words
- PIC32单片机harmony开发环境 - SPI例程和代码分析
- 软件项目报价明细表_BIM必学软件之REVIT
- rest-framework解析器,url控制,分页,响应器,渲染器,版本控制
- Shell编程之条件判断
- 三角形箭头向右的_向右三角形特殊符号
- msxml6_x86.msi和msxml6_ia64.msi和msxml6_x64.msi的选择
- pcb外观维修_5种最常见的PCB维修
- 扫码签到之动态刷新二维码——给每一帧附加有效期(原理、web 小程序变量共享)
- 左声道,右声道和立体声
- 项目管理笔记-第十三章 项目相关方管理
- oracle 创建自增序列
- 【论文速览】深度模型-降维与聚类
- 【评测】SUPRAcap 100囊式深层过滤器 泽平科技一级代理
- 2.2 架构模式在新浪微博的应用[读书敲录]
- Dev Board---将摄像机连接到开发板
- Mac更新系统后 删除文件后可用空间还变少了?
热门文章
- 适用于Java开发人员的Elasticsearch:Elasticsearch生态系统
- java 和javafx_JavaFX 2 XYCharts和Java 7功能
- spring 构造函数注入_Spring构造函数注入和参数名称
- 古巴平台上的通用过滤器–类固醇上的excel过滤器
- @Deprecated新外观可能是什么?
- Spring注释,我从来没有机会使用第1部分:@primary
- 具有链接资源的Spring RestTemplate
- RHQ指标的WildFly子系统
- 具有ReadWriteLock的Java并发
- php 数组是否属于迭代器,数组的迭代器属性Iterator介绍