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每相关推荐

  1. android两种广播注册区别,Android 注册广播的两种方式对比

    Android 注册广播的两种方式对比 1.常驻型广播 常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到, 他的注册方式就是在你的应用程序中的AndroidManif ...

  2. (转载)Android两种Tab分页的方式:TabActivity和ActivityGroup以及Android项目几种常见的应用架构...

    在Android里面Tab分页,常用的方法有两种: 一.TabActivity和TabHost的结合 1.主类继承TabActivity public class Tagpage extends Ta ...

  3. Android两个canvas混合叠加,Android Canvas设置绘画时重叠部分的处理模式【含效果图】...

    在Android的PorterDuff.Mode类中列举了他们制定的规则: android.graphics.PorterDuff.Mode.SRC:只绘制源图像 android.graphics.P ...

  4. android两个活动共用变量,Android:多个Activity共享全局变量

    直接看实现方法吧~ 首先新建一个activity用来存放需要共享的全局变量的成员和方法,比如这里我新建一个MyDataActivity: package com.anwensoft.cardvr.ac ...

  5. android 两个imageview重叠,在android中覆盖两个图像以设置imageview

    您可以使用以下代码解决问题或在此处下载演示 创建两个函数来处理每个函数. 首先,绘制画布,并从点(0,0)将图像绘制在彼此之上 单击按钮public void buttonMerge(View vie ...

  6. android实现评论列表_【Android视图效果】分组列表实现吸顶效果

    效果图 效果图 分析 先来分析一下,可以看到这是一个按月份分组的2行图片列表,列表顶部一个悬浮栏,会随着列表滑动而刷新,点击顶部栏,弹出了一个筛选框. 思路 1.列表部分 可以用RecyclerVie ...

  7. android listview标题置顶,Android仿QQ左滑删除置顶ListView操作

    最近闲来无事,于是研究了一下qq的左滑删除效果,尝试着实现了一下,先上效果图: 大致思路原理: - 通过设置margin实现菜单的显示与隐藏 - 监听onTouchEvent,处理滑动事件 上代码 i ...

  8. android imageview 锯齿,[置顶] android 自定义圆角ImageView以及锯齿的处理

    看到很多人开发过程中要使用圆角图片时,解决方法有: 1.重新绘制一张图片 2.通过布局来配置 3.通过重写View来实现 其中1,2在这里就不讲了,重点讲讲方法三的实现. 实现一:通过截取画布一个圆形 ...

  9. 罗升阳:那两年炼就的Android内功修养

    [置顶] 那两年炼就的Android内功修养 原文链接:http://blog.csdn.net/luoshengyang/article/details/8923485 经过两年的时间,终于完成对A ...

最新文章

  1. 制药行业SAP项目里的那些MES系统
  2. 数据结构学习笔记4.1--查找节点
  3. HDU 1853 MCMF
  4. 英语听力里面的religion words
  5. PIC32单片机harmony开发环境 - SPI例程和代码分析
  6. 软件项目报价明细表_BIM必学软件之REVIT
  7. rest-framework解析器,url控制,分页,响应器,渲染器,版本控制
  8. Shell编程之条件判断
  9. 三角形箭头向右的_向右三角形特殊符号
  10. msxml6_x86.msi和msxml6_ia64.msi和msxml6_x64.msi的选择
  11. pcb外观维修_5种最常见的PCB维修
  12. 扫码签到之动态刷新二维码——给每一帧附加有效期(原理、web 小程序变量共享)
  13. 左声道,右声道和立体声
  14. 项目管理笔记-第十三章 项目相关方管理
  15. oracle 创建自增序列
  16. 【论文速览】深度模型-降维与聚类
  17. 【评测】SUPRAcap 100囊式深层过滤器 泽平科技一级代理
  18. 2.2 架构模式在新浪微博的应用[读书敲录]
  19. Dev Board---将摄像机连接到开发板
  20. Mac更新系统后 删除文件后可用空间还变少了?

热门文章

  1. 适用于Java开发人员的Elasticsearch:Elasticsearch生态系统
  2. java 和javafx_JavaFX 2 XYCharts和Java 7功能
  3. spring 构造函数注入_Spring构造函数注入和参数名称
  4. 古巴平台上的通用过滤器–类固醇上的excel过滤器
  5. @Deprecated新外观可能是什么?
  6. Spring注释,我从来没有机会使用第1部分:@primary
  7. 具有链接资源的Spring RestTemplate
  8. RHQ指标的WildFly子系统
  9. 具有ReadWriteLock的Java并发
  10. php 数组是否属于迭代器,数组的迭代器属性Iterator介绍