-
Viewpager
2017-07-16 17:15:59 -
viewpager
2019-06-03 09:17:24描述:viewpager+fragment,fragment会由fragmentManager进行管理,viewpager会从fragmentmanager中取fragment,即使list更新,数据也不会更新。fragmentmanager中是否存在已有的fragent主要是根据给fragment设置的...】缓存问题
描述:viewpager+fragment,fragment会由fragmentManager进行管理,viewpager会从fragmentmanager中取fragment,即使list更新,数据也不会更新。fragmentmanager中是否存在已有的fragent主要是根据给fragment设置的tag值决定的。而默认都是下面这个方法设置的tag值。当position(tag)值重复的时候就会导致数据错乱问题。要想不使用fragmentManager的缓存,tag值只要设置唯一即可。@Override public long getItemId(int position) { return position; }
-
ViewPager
2016-12-05 15:45:55ViewPager是安卓3.0以上可以使用的控件,功能就是使视图左右滑动.在android.support.v4.view包下,是个扩展的自定义控件.故使格式:在布局文件里应该是android.support.v4.view.ViewPager 注意ViewPager的内部pager...ViewPager是安卓3.0以上可以使用的控件,功能就是使视图左右滑动.在android.support.v4.view包下,是个扩展的自定义控件.故使格式:在布局文件里应该是android.support.v4.view.ViewPager
注意ViewPager的内部pager页面不能使用Activity与Fragment原因:
不能使用activity的原因:viewpager中存放是的view控件,activity不能返回view,activity是不能在veiwpager中使用
不能使用Fragment的原因:(以下是特有现象,但如果不是这种fragment多次嵌套fragment的话,可以使用fragment)
因为之前已经使用了HomeFragment,在接下来的操作还会有新界面创建,这样就会出现一个Fragment中使用了另一fragment,另一个fragment中又使用了一个fragment的现象,对于小内存的手机来说,容易内存溢出(OOM).
1.在所要使用的Activity的布局xml文件里定义这个组件,
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
2.在Activity里找到ViewPager控件,并得到ViewPager控件对象.
ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
3.准备数据,创建ArrayList集合,在创建一个承载数据类型的bean类,把数据添加到bean类中,再把bean类挨个添加到集合中.
4.为ViewPager设置Adapter适配器
vewPager.setAdapter(new 自定义的适配器类());
5.创建一个自定义的ViewPager适配器内部类,要继承ViewPager,并复写其方法
class MyAdapter extends PagerAdapter{
//ViewPager滑动的次数
public int getCount() {
//设置数小的话,图片到头了就没法循环出现,要想循环播放,一般指定50000次即可.return 50000;
//且报空指针异常的地方(一般和获取ViewPager当前选中的是第几页有关的都要改为position(当前页数)%list.size()(取余数)
return list.size();
}
提示:如果想要ViewPager能向左滑动,只需要在主线程,
改变ViewPager的默认选中位置即可:viewPager.setCurrentItem(int);
//该函数用来判断instantiateItem(ViewGroup, int)函数所返回来的Key // 与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一个View)
public boolean isViewFromObject(View view, Object object) {
return view == object;//这里是固定写法,一般不用变,写死了.
}
创建Pager的方法,相当于BaseAdapter的getView方法,很重要.(就是没有position类似的参数,所以没有优化)一般在该方法中要加载并返回View对象,并且要绑定数据,但是不需要复用Pager了,且返回container没有用.
//注意:是参数为ViewGroup container(container代表了ViewPager控件自身)的instantiateItem方法第二个,不要弄错了
public Object instantiateItem(ViewGroup container, int position) {
//1.加载View
ImageView imageView = new ImageView(MainActivity.this);
imageView.setScaleType(ScaleType.FIT_XY);//设置所包裹的图片占满整个屏幕
//2.绑定数据到View
imageView.setImageResource(list.get(position).getIconId());
//注意:必须要将控件对象添加到VIewPager中来
container.addView(imageView);
return imageView;
}
/**防止内存泄漏.相当于ListView的复用container
* 销毁一个page,该方法的实际就是将instantiateItem返回的VIew对象从ViewPager中移除,
container:还是ViewPager控件自身,object:则代表了View控件,使用时要强转成View一下
补充:为什么参数是Object,而不直接是View,因为虽然99%是view,但也有可能是Fragment,所以用Object,提高了可扩展性.
*/
public void destroyItem(ViewGroup container, int position, Object object) {
//super.destroyItem(container, position, object);此方法一定要删掉.
container.removeView((View) object);
}
6.为ViewPager设置页面切换监听器.并在onPageSelected里进行文本的设置(所有的 position : 条目的位置)
viewPager.addOnPageChangeListener(new OnPageChangeListener() {//也可以是setOnPageChangeListener,二者是一样的,只不过set被淘汰了
//Viewpager的页面pager切换完成时,执行该方法
public void onPageSelected(int position) {
Log.e("log","当页面改变时执行:onPageSelected");
updateTitleAndDot()//记得在第4步,为ViewPager设置Adapter适配器下面,调用该方法,使ViewPager一创建,第一个页面就有文本数据
}
//ViewPager控件处于滑动中,执行该方法
参数信息 positionOffset:页面移动距离的百分比例 positionOffsetPixels : 移动的偏移的像素
注意:positionOffsetPixels,positionOffset:会随着页面向右滑动而不断增加(无限接近于1),但当完全滑动到另一页时,数据就变成了0.0
public void onPageScrolled(int position, float positionOffset,int positionOffsetPixels) {
Log.d("log","当页面处于滑动中时执行:onPageScrolled");
}
//当ViewPager控件被点击或松开时(也可以理解为pager滑动状态改变时),执行该方法
public void onPageScrollStateChanged(int state) {
Log.i("log","当页面时执行:onPageScrollstateChanged");
}
}
);
-
ViewPager 详解(一)---基本入门
2014-08-09 09:48:01前言:这两天研究研究ViewPager滚动功能,现在很多的app都有用到这个功能,我们的大虾米也有这个模块。要研究就彻底的研究研究,我从不满足于一个功能只是简单的应用,要学就学的彻底,所以我打算将ViewPager 分几篇...前言:这两天研究研究ViewPager滚动功能,现在很多的app都有用到这个功能,我们的大虾米也有这个模块。要研究就彻底的研究研究,我从不满足于一个功能只是简单的应用,要学就学的彻底,所以我打算将ViewPager 分几篇写,研究的哪个程度就写到哪个程度吧。今天是第一篇,基本入门篇 。
相关文章:
3、《ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同》
4、《ViewPager 详解(四)----自主实现滑动指示条》
5、《ViewPager 详解(五)-----使用Fragment实现ViewPager滑动》
首先让大家有个全局的认识,直接上个项目,看看仅仅通过这几行代码,竟然就能完成如此强悍的功能。下篇再结合API仔细讲讲为什么要这么写。
效果图:
实现了三个view间的相互滑动
第一个VIEW向第二个VIEW滑动 第二个VIEW向第三个VIEW滑动
一、新建项目,引入ViewPager控件
ViewPager。它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换。
1.在主布局文件里加入
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" tools:context="com.example.testviewpage_1.MainActivity" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </RelativeLayout>
其中 <android.support.v4.view.ViewPager /> 是ViewPager对应的组件,要将其放到想要滑动的位置
2、新建三个layout,用于滑动切换的视图
从效果图中也可以看到,我们的三个视图都非常简单,里面没有任何的控件,大家当然可以往里添加各种控件,但这里是个DEMO,只详解原理即可,所以我这里仅仅用背景来区别不用layout布局。
布局代码分别如下:
layout1.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" android:orientation="vertical" > </LinearLayout>
layout2.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffff00" android:orientation="vertical" > </LinearLayout>
layout3.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ff00ff" android:orientation="vertical" > </LinearLayout>
二、代码实战
先上整体代码,然后逐步讲解。
package com.example.testviewpage_1; /** * @author harvic * @date 2014.8.9 */ import java.util.ArrayList; import java.util.List; import java.util.zip.Inflater; import android.app.Activity; import android.os.Bundle; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class MainActivity extends Activity { private View view1, view2, view3; private ViewPager viewPager; //对应的viewPager private List<View> viewList;//view数组 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = (ViewPager) findViewById(R.id.viewpager); LayoutInflater inflater=getLayoutInflater(); view1 = inflater.inflate(R.layout.layout1, null); view2 = inflater.inflate(R.layout.layout2,null); view3 = inflater.inflate(R.layout.layout3, null); viewList = new ArrayList<View>();// 将要分页显示的View装入数组中 viewList.add(view1); viewList.add(view2); viewList.add(view3); PagerAdapter pagerAdapter = new PagerAdapter() { @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0 == arg1; } @Override public int getCount() { // TODO Auto-generated method stub return viewList.size(); } @Override public void destroyItem(ViewGroup container, int position, Object object) { // TODO Auto-generated method stub container.removeView(viewList.get(position)); } @Override public Object instantiateItem(ViewGroup container, int position) { // TODO Auto-generated method stub container.addView(viewList.get(position)); return viewList.get(position); } }; viewPager.setAdapter(pagerAdapter); } }
代码量很小,全部放在了OnCreate()函数中。
1、先看声明的变量的意义:
private View view1, view2, view3; private List<View> viewList;//view数组 private ViewPager viewPager; //对应的viewPager
首先viewPager对应 <android.support.v4.view.ViewPager/>控件。
view1,view2 ,view3对应我们的三个layout,即layout1.xml,layout2.xml,layout3.xml
viewList是一个View数组,盛装上面的三个VIEW
2、接下来是他们的初始化过程:
viewPager = (ViewPager) findViewById(R.id.viewpager); LayoutInflater inflater=getLayoutInflater(); view1 = inflater.inflate(R.layout.layout1, null); view2 = inflater.inflate(R.layout.layout2,null); view3 = inflater.inflate(R.layout.layout3, null); viewList = new ArrayList<View>();// 将要分页显示的View装入数组中 viewList.add(view1); viewList.add(view2); viewList.add(view3);
初始化过程难度不大,就是将资源与变量联系起来布局,最后将实例化的view1,view2,view3添加到viewList中
3、PageAdapter——PageView的适配器
适配器这个东东想必大家都不莫生,在ListView中也有适配器,listView通过重写GetView()函数来获取当前要加载的Item。而PageAdapter不太相同,毕竟PageAdapter是单个VIew的合集。
PageAdapter 必须重写的四个函数:
- boolean isViewFromObject(View arg0, Object arg1)
- int getCount()
- void destroyItem(ViewGroup container, int position,Object object)
- Object instantiateItem(ViewGroup container, int position)
先看看各个函数,我们上面都做了什么吧:
@Override public int getCount() { // TODO Auto-generated method stub return viewList.size(); }
getCount():返回要滑动的VIew的个数
@Override public void destroyItem(ViewGroup container, int position, Object object) { // TODO Auto-generated method stub container.removeView(viewList.get(position)); }
destroyItem():从当前container中删除指定位置(position)的View;
@Override public Object instantiateItem(ViewGroup container, int position) { // TODO Auto-generated method stub container.addView(viewList.get(position)); return viewList.get(position); } };
instantiateItem():做了两件事,第一:将当前视图添加到container中,第二:返回当前View
@Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO Auto-generated method stub return arg0 == arg1; }
isViewFromObject():对于这个函数就先不做讲解,大家目前先知道它要这样重写就行了,后面我们会对它进行改写。
下一篇,我将仔细讲解这几个函数的意义,与有关Key的知识,当然最后也会有个例子给大家。这篇就到这了。
源码地址:http://download.csdn.net/detail/harvic880925/7733249
请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/38453725 万分感激!!!!!
如果你喜欢我的文章,你可能更喜欢我的公众号
-
ViewPager 详解(五)-----使用Fragment实现ViewPager滑动
2014-08-18 15:03:51前言:前几篇文章讲解了ViewPager的普通实现方法,但android官方最推荐的一种实现方法却是使用fragment,下面我们使用fragment来重新实现一下第一篇《ViewPager 详解(一)---基本入门》所实现的效果。 系列文章... -
Android ViewPager使用详解
2012-11-10 21:34:06而viewpager就是其中之一利用它,我们可以做很多事情,从最简单的导航,到页面菜单等等。那如何使用它呢,与LisstView类似,我们也需要一个适配器,他就是PagerAdapter。看一下api的图片, ViewPager的功能就是可以... -
ViewPager 详解(二)---详解四大函数
2014-08-11 09:29:26前言:上篇中我们讲解了如何快速实现了一个滑动页面,但问题在于,PageAdapter必须要重写的四个函数,它们都各有什么意义,在上节的函数内部为什么要这么实现,下面我们就结合android...3、《ViewPager 详解(三)-... -
ViewPager嵌套ViewPager
2017-10-17 15:15:47两个ViewPager嵌套,实现无限循环即:A(1)-A2(B1)-A2(B2)-A(1) A:父ViewPager 有2个选项,B:为子ViewPager.同样有2个选项 A2即为B. -
ViewPager 全面总结
2018-03-01 11:41:14Viewpager,视图翻页工具,提供了多页面切换的效果。Android 3.0后引入的一个UI控件,位于v4包中。低版本使用需要导入v4包,但是现在我们开发的APP一般不再兼容3.0及以下的系统版本,另外现在大多数使用Android ... -
ViewPager,ScrollView 嵌套ViewPager滑动冲突解决
2016-10-26 22:32:31ViewPager,ScrollView 嵌套ViewPager滑动冲突解决这篇博客主要讲解一下几个问题 - 粗略地介绍一下View的事件分发机制 - 解决事件滑动冲突的思路及方法 - ScrollView 里面嵌套ViewPager导致的滑动冲突 - ... -
viewpager嵌套viewpager
2016-08-30 16:37:381. MainActivty下4个Fragment组成第一个viewpager 2. 第一个Fragment下再次使用Viewpager,旗下集成2个子Fragment 3. 备注:ViewPager支持禁止滑动(项目可能需求) 3. ToolList 1. import android.support.v4.... -
ViewPager加载Activity
2012-10-26 18:16:41ViewPager滑动切换Activity,类似于新浪微博的消息模块 -
viewpager使用_ViewPager2:官方Viewpager升级版来临
2020-12-07 23:45:19这两天浏览安卓开发者官网的时候,发现google悄然推出了一个新的控件:ViewPager2 ,一看名称就知道这是一个和我们常用的 ViewPager 功能相似的控件,算是ViewPager的升级版吧。目前还只是推出了第一个预览版,我们... -
探索取代ViewPager的ViewPager2
2020-01-17 18:38:41文章目录探索取代ViewPager的ViewPager2前言ViewPager2 和 ViewPager 的区别ViewPager2 新增功能深入了解ViewPager2实现ViewPager2使用FragmentStateAdapter实现ViewPager2 持续更新中… 前言 早在2019年2月7日... -
ViewPager嵌套ViewPager,内层ViewPager
2018-04-30 15:37:11//第一页响应父类的左滑,最后一页响应父类的右滑public class RollViewPager extends ViewPager { public RollViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public.... -
Viewpager迁移至ViewPager2实现Tab标签页面
2019-12-16 16:26:19ViewPager2是什么呢? ViewPager2 是 ViewPager 的下一代版本,带来了更强的功能并修复了之前的 bug;也就是解决了ViewPager的bug和不支持RTL布局等等其他问题,Google同时也放弃对ViewPager的维护了。 ViewPager2... -
Android(ViewPager中的ViewPager)ViewPager FragmentPagerAdapter嵌套子ViewPager FragmentPagerAdapter...
2015-10-18 10:34:52Android(ViewPager中的ViewPager)ViewPager FragmentPagerAdapter嵌套子ViewPager FragmentPagerAdapter页面不能正常显示问题 Android的ViewPager如果只使用一“层” FragmentPagerAdapter构建ViewPager,那么将... -
ViewPager2
2020-05-31 20:31:34资料整理: ViewPager2:官方Viewpager升级版来临 使用总结: 使用注意事项: -
ViewPager用法
2015-11-30 09:28:38博客地址:http://blog.csdn.net/dmk877/article/details/50060745,ViewPager中PagerAdapter的用法详解 -
ScrollView嵌套ViewPager,可滑动,可动态设置ViewPager高度
2020-05-05 14:39:08该demo实现了android开发ScrollView嵌套ViewPager页面,解决嵌套滑动冲突以及Viewpager显示不同内容时,动态设置高度 -
官方 Viewpager 升级版 - ViewPager2 实战
2019-03-30 15:35:57Google 在 `androidx` 组件包里增加了一个新的组件 `ViewPager2`,目前已经更新了两个 alpha 版本了。那么,和之前的 `ViewPager` 组件相比,有什么改进呢?查看[官方文档] -
在fragment中使用viewpager_ViewPager2:官方Viewpager升级版来临
2020-11-27 15:11:55浏览安卓开发者官网的时候,发现google悄然推出了一个新的控件:ViewPager2 ,一看名称就知道这是一个和我们常用的 ViewPager 功能相似的控件,算是ViewPager的升级版吧。目前还只是推出了第一个预览版,我们可以... -
ViewPager 套fragment 再套 ViewPager 套fragment
2016-10-11 16:32:49ViewPager 套fragment 再套 ViewPager 套fragment,本例子是借鉴http://download.csdn.net/detail/u013682582/9462667此例子。解决重复加载fragment,使得切换时标题未选中的问题 -
ViewPager与Viewpager之间的冲突
2019-09-30 00:35:09【重要:】为了避免广告Viewpager与TAB栏目的Viewpager的冲突,增加以下事件监听 1 viewpager_img.setOnTouchListener(new OnTouchListener() { 2 @Override 3 public boolean onTouch(View v, ... -
Android之viewPager嵌套viewPager无法滑动子viewPager
2015-02-26 10:07:19现在最头疼的事就是需求不明确,这不,有遇到你个奇葩需求,父viewPager总共有三个选项卡,第一个选项卡里嵌入一个子viewPager,这时候问题就来了,子viewPager无法滑动,我猜的事父viewPager把子viewPager拦截了,...
-
linux c 通过FTP 协议上传文件 源码 亲测可用
-
迭代读取被封装的用户列表并更新的一种方法
-
零基础一小时极简以太坊智能合约开发环境搭建并开发部署
-
基于电商业务的全链路数据中台落地方案(全渠道、全环节、全流程)
-
使用PHP实现WEB网站登陆后台编写
-
zookeeper-3.4.14.tar.zip
-
工程制图 AutoCAD 2012 从二维到三维
-
MySQL NDB Cluster 负载均衡和高可用集群
-
基于对偶四元数的姿轨耦合动力学模型1.md
-
linux c can总线通信 源代码
-
项目经理成长之路
-
51单片机电子时钟设计.rar
-
linux基础入门和项目实战部署系列课程
-
Vue项目城市选择页-兄弟组件数据传值(8-6)
-
基于springboot实现表单重复提交.docx
-
2021年 系统分析师 系列课
-
华为企业服务风险评估服务主打胶片.ppt
-
基于Flink+Hudi构建企业亿级云上实时数据湖教程(PC、移动、小
-
用Excel进行数据分析:数据分析工具在哪里?
-
为解决cpu与主存的速度匹配可采用什么