关于TabLayout+ViewPager组合实现多页面滑动
转载请注明出处:http://blog.csdn.net/ht_android/article/details/46647711
在android提供的design library中新增了一个控件,叫TabLayout。它继承自HorizontalScrollView,能够实现android中多页面滑动切换效果。可是一般须要和ViewPager组合使用,官方API地址:https://developer.android.com/reference/android/support/design/widget/TabLayout.html
以下来解说一下详细的使用流程:
首先,要使用该控件就须要加入design library,在android studio(还没有使用Android studio的小伙伴们要赶紧更换啦)中加入依赖
compile ‘com.android.support:design:22.2.0’
然后再布局文件里使用TabLayout
<android.support.design.widget.TabLayout
android:id="@+id/tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true" />
紧接着在以下加入ViewPager
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/tablayout" />
布局文件完毕了,接下来去定义ViewPager中的适配器,这里我使用的是Fragment,所以继承自FragmentPagerAdapter ,代码例如以下:
public class MyPageAdapter extends FragmentPagerAdapter {
ArrayList<Fragment> datas;
ArrayList<String> titles;
public CommunityPageAdapter(FragmentManager fm) {
super(fm);
}
public void setData(ArrayList<Fragment> datas) {
this.datas = datas;
}
public void setTitles(ArrayList<String> titles) {
this.titles = titles;
}
@Override
public Fragment getItem(int position) {
return datas == null ? null : datas.get(position);
}
@Override
public int getCount() {
return datas == null ? 0 : datas.size();
}
@Override
public CharSequence getPageTitle(int position) {
return titles == null ?
null : titles.get(position);
}
}
适配器中须要两个数据集合,分配填充Fragment和显示的标题。
然后在须要使用的页面加入例如以下代码:
MyPageAdapter myPageAdapter = new MyPageAdapter(getFragmentManager());
ArrayList<Fragment> datas = new ArrayList<Fragment>();
datas.add(new AFragment());
datas.add(new BFragment());
datas.add(new CFragment());
myPageAdapter.setData(datas);
ArrayList<String> titles = new ArrayList<String>();
titles.add("A");
titles.add("B");
titles.add("C");
myPageAdapter.setTitles(titles);
如今适配器和数据已经准备好了。那么接下来就是要把数据放入ViewPager中,并使ViewPager和TabLayout相关联:
TabLayout tabLayout = (TabLayout) findViewById(R.id.tablayout);
ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
// 将适配器设置进ViewPager
viewPager.setAdapter(myPageAdapter);
// 将ViewPager与TabLayout相关联
tabLayout.setupWithViewPager(viewPager);
关联之后执行发现,事实上ViewPager因为预载入机制,导致每次都会提前载入下一个页面。假设页面的数据量大。那么这将会占用大量的内存。有什么办法能够仅仅载入当前显示的页面呢?
通过查找相关资料发现。有一个方法setOffscreenPageLimit(int),该方法的作用是设置提前载入页面的数量,尝试使用viewPager.setOffscreenPageLimit(0);
后发现无效。
继续查阅资料后发现,原来这是因为ViewPager的机制导致的,最少须要预载入一个页面。Requested offscreen page limit 0 too small; defaulting to 1,相关问题链接:http://stackoverflow.com/questions/10073214/viewpager-setoffscreenpagelimit0-doesnt-work-as-expected
发现了能够完美解决该问题的方法:
在Fragment中有一个方法,setUserVisibleHint,该方法能够获取当前页面的展示情况
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// 页面正在展示,在这里载入你的数据
}else{
// 页面没有展示
}
}
基本到这一步功能已经实现了。可是,另一些细节须要注意,究竟ViewPager滑动的时候为什么会造成TabLayout的标题也随之更换呢?原来setupWithViewPager被调用的时候,执行了以下的代码
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(this));
this.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager));
到最后。另一个问题。那么就是假设我们的标题有多条,导致超出了TabLayout的显示范围,这该怎样解决呢?非常easy。查阅官方API发现,TabLayout有一个方法是setTabMode,它是用来设置TabLayout的展示模式。而这种方法接受两个常量,MODE_SCROLLABLE 以及 MODE_FIXED。显而易见,当我们设置为MODE_SCROLLABLE 它就能自己主动依据标题的数量。滑动展示啦,功能到这里就完美实现了!
关于TabLayout+ViewPager组合实现多页面滑动的更多相关文章
- Android ViewPager初探:让页面滑动起来
下一篇:<Android ViewPager再探:增加滑动指示条> ViewPager需要用到适配器PagerAAdapter,以下四个函数需要重写: instantiateItem(Vi ...
- Android ViewPager再探:增加滑动指示条
上一篇:<Android ViewPager初探:让页面滑动起来> ViewPager只是左右滑动有些丑,也不知道当前位于第几页面. 可以在上方加入滑动指示条,来确定当前位置. 只需要修改 ...
- TabLayout+ViewPager 标题不显示问题
第一次用TabLayout+ViewPager 组合在布局中写好了三个标题预览没问题而且也设置了 app:tabIndicatorColor="@color/colorAccent" ...
- 011 Android TabLayout+ViewPager实现顶部滑动效果(多个页面)
1.TabLayout介绍 TabLayout提供了一个水平的布局用来展示Tabs,很多应用都有这样的设计,典型的有网易新闻,简书,知乎等.TabLayout就可以很好的完成这一职责,首先TabLay ...
- 【Android 界面效果27】利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果
本文主要介绍如何利用ViewPager.Fragment.PagerTabStrip实现多页面滑动效果.即google play首页.新浪微博消息(at.评论.私信.广播)页面的效果.ViewPage ...
- Android 利用ViewPager、Fragment、PagerTabStrip实现多页面滑动效果
本文主要介绍如何利用ViewPager.Fragment.PagerTabStrip实现多页面滑动效果.即google play首页.新浪微博消息(at.评论.私信.广播)页面的效果.ViewPage ...
- Android TabLayout+ViewPager禁止滑动
1.重写ViewPager并重写覆盖ViewPager的onInterceptTouchEvent(MotionEvent arg0)方法和onTouchEvent(MotionEvent arg0) ...
- viewpager在最后一页滑动之后,跳转到主页面
[TOC] viewpager在最后一页滑动之后,跳转到主页面 思路 主要有是两个监听, 一是addOnPageChangeListener();二是setOnTouchListener(): add ...
- Android开发之漫漫长途 Fragment番外篇——TabLayout+ViewPager+Fragment
该文章是一个系列文章,是本人在Android开发的漫漫长途上的一点感想和记录,我会尽量按照先易后难的顺序进行编写该系列.该系列引用了<Android开发艺术探索>以及<深入理解And ...
随机推荐
- [poj 3904] sky code 解题报告(组合计算+容斥原理)
题目链接:http://poj.org/problem?id=3904 题目大意: 给出一个数列,询问从中取4个元素满足最大公约数为1的方案数 题解: 很显然,ans=总的方案数-最大公约数大于1的4 ...
- [-] Failed to load plugin from /usr/share/metasploit-framework/plugins/db_autopwn: No classes were loaded from /usr/share/metasploit-framework/plugins/db_autopwn in the Msf::Plugin namespace.
问题详情 然后,执行,出现如下问题,则说明大家的这个文件,下载不是完整的或者你上传不完整. msf > load db_autopwn [-] Failed to load plugin fro ...
- AWK行处理的用法实例
第一节 awk的工作流程及基础用法 awk操作符会先检索文件的行信息,然后在行信息里找需要的内容. Awk的默认分割付是空格,awk '/模式/{print $1,$2}' file ##模式的位置可 ...
- 在VPS上用Outline Manager 建立*** 增强版服务器
在VPS上用Outline Manager 建立*** 增强版服务器 原文 https://free.com.tw/google-outline/ Outline 是Google Jigsaw的一款开 ...
- 16. IntellIJ IDEA 配置 Maven 以及 修改 默认 Repository
转自:https://www.cnblogs.com/phpdragon/p/7216626.html 今天将IntellIJ IDEA 关于Maven的配置总结一下,方便以后可参考. IDEA版本: ...
- centos 7.3 配置vnc 服务 图形界面登录
1.检查系统是否有安装tigervnc-server软件包 rpm -qa |grep vnc 默认的系统未装tigervnc-server软件包 2.安装tigervnc-server软件包 yum ...
- BZOJ 3544 treap (set)
我只是想找个treap的练习题-- 每回找到lower_bound 就好啦 //By SiriusRen #include <cstdio> #include <cstring> ...
- BZOJ 1112 线段树
思路: 权值线段树 (找中位数用的) 记录下出现的次数和sum 一定要注意 有可能中位数的值有许多数 这怎么办呢 (离散化以后不去重就行了嘛--.) (为什么他们想得那么麻烦) //By Sirius ...
- Android自定义组件系列【16】——最帅气的自动滚动广告条
前一段时间要实现一个滚动的广告条,参考了一下网上许多实现,发现实现都很麻烦,所以我决定自己使用ViewFlipper来实现一个,在此将代码贴出来,与大家共享. 转载请说明出处:http://blog. ...
- 局域网ARP病毒的清理
局域网ARP病毒的清理 作者:IT动力源 来源:IT动力源收集整理 现在局域网中感染ARP 病毒的情况比较多,清理和防范都比较困难,给不少的网络管理员造成了很多的困扰.下面就是个人在处理这个 ...