Android中viewPager的一两点使用
Android中viewPager的一两点使用
viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用。这里只简单说下直接使用。
使用viewPager的步骤如下:
(1)在布局中放入viewPager的控件
(2)设置加载到viewPager中的view
(3)编写viewPager特有的adapter
(4)实例化viewPager并给他绑定上步设置的adapter
这个步骤体现的也是MVC思想,可以参考我之前的博文http://www.cnblogs.com/qifengshi/p/5056468.html
这里为了方便说明 我新建一个项目来说明viewPager的使用
步骤一 在布局中新建一个viewPager
布局文件如下:
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v4.view.ViewPager>
设置加载到viewPager中的view
这里为了方便,显示设置2个不同背景的颜色的view,放入viewPager中,每个view的布局如下图:
item_one
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_red_light">
</LinearLayout>
item_two
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/holo_blue_bright">
</LinearLayout>
编写viewPager特有的adpter
这里我们继承viewPager的PagerAdapter,主要重写getCount方法、destroyItem 、instantiateItem 、isViewFromObject 、。代码如下:
public class Adapter extends PagerAdapter{
private List<View> views;
public Adapter(List<View> views){
this.views = views;
}
@Override
public int getCount() {
return views.size();
}
@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
((ViewPager) arg0).removeView(views.get(arg1));
}
@Override
public void finishUpdate(View arg0) {
}
@Override
public Object instantiateItem(View arg0, int arg1) {
((ViewPager) arg0).addView(views.get(arg1), 0);
return views.get(arg1);
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == (arg1);
// return false;
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
}
实例化viewPager并绑定Adapter
这里,实例化viewPager 为mpager ,然后将建好的view:item_one 和item_two 通过LayoutInflater加载到建好的View类型的数组中。将数组加到List<View>里面。作为参数传入到adapter。代码如下:
private ViewPager mpager;
private List<View> myview = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mpager = (ViewPager) findViewById(R.id.view_pager);
LayoutInflater mInflater = getLayoutInflater();
View [] pagers = {mInflater.inflate(R.layout.item_one ,null),
mInflater.inflate(R.layout.item_two , null)};
for(int i = 0; i < pagers.length ; i++) {
myview.add(pagers[i]);
}
Adapter ad = new Adapter(myview);
mpager.setAdapter(ad);
mpager.setCurrentItem(0);
}
PS :实现viewPager手动无限循环
这里用一种设置页面跳转的方式来实现无限循环。在myviews数组中加入两个view,分别在第0个位置加入最后一个itemview,和最后一个位置加入第一个itemview。代码如下所示:
final View [] pagers = {mInflater.inflate(R.layout.item_one ,null),
mInflater.inflate(R.layout.item_two , null),
mInflater.inflate(R.layout.item_three,null)};
for(int i = 0; i < pagers.length ; i++) {
myview.add(pagers[i]);
}
myview.add(0,mInflater.inflate(R.layout.item_three , null));
myview.add(4, mInflater.inflate(R.layout.item_one, null));
这里为了测试方便,这里在上个基础上加入了一个item,就是三张view循环播放
用来实现衔接。当向右滑动到最后一个页面的时候,将这个页指定为第一个view所在的页,向左滑动到第一个页面的时候,将这个页面制定为最后一个view所在页。注意这里的view最后一个不是指数组的最后一个 而是指三个view中最后一个。
设置viewPager的实例化对象的方法setOnPageChangeListener 虽然此方法显示不推荐使用,但为了实现这个功能,还是先将就用吧。等日后谷歌更新viewPager,能有属性自动实现循环。
代码如下:
mpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
int index = position;
if(index == 0){
//注意这里pagers数组,不是myviews数组
index = pagers.length;
}else if(position == pagers.length + 1){
index = 1;
}
if(position != index){
mpager.setCurrentItem(index, false);
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
重写Adapter中的instantiateItem 方法来显示view
public Object instantiateItem(View arg0, int arg1) {
if(arg1 == 0){
((ViewPager) arg0).removeView(views.get(myview.size() - 3));
((ViewPager) arg0).addView(views.get(myview.size() - 3), 0);
}else if(arg1 == myview.size() - 1){
((ViewPager) arg0).removeView(views.get(0));
((ViewPager) arg0).addView(views.get(0), 0);
}else{
((ViewPager) arg0).addView(views.get(arg1), 0);
}
return views.get(arg1);
}
这样无限滑动就可以简单实现,但在滑动时会出现有空白页面的bug,可能是因为先removeView,在加入view的原因。
Activity与ViewPager中Fragment之间的互动
在Fragment中,可以调用getActivity().findViewById()的方法实现对Activity中的控件进行操作。
在Activity中,可以调用viewPager.getAdapter().instantiateItem(viewPager, index);实现得到当前的ViewPager中的fragment。注意一定要是通过instantiateItem得到,如果通过getItem得到的fragment返回的会是NULL,因为这个是新生成的fragment。而不是已经加载进去的fragment。
Android中viewPager的一两点使用的更多相关文章
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...
- Android中ViewPager实现滑动条及与Fragment结合的实例教程
ViewPager类主要被用来实现可滑动的视图功能,这里我们就来共同学习Android中ViewPager实现滑动条及与Fragment结合的实例教程,需要的朋友可以参考下 自主实现滑动指示条先上一个 ...
- android中viewPager+fragment实现的屏幕左右切换(进阶篇)
Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等.可以看做是一个子Activity. 先看一下布局: 1 <LinearLayout xmlns:a ...
- android中viewPager实现的屏幕左右切换(入门篇)
大多数的APP都可以实现几个屏幕来回的切换, 首先新建两个Activity,内容随意,布局随意.接下来在MainActivity.xml: <RelativeLayout xmlns:andro ...
- android 中 viewpager 滑动的指示器
先看下效果图: 这个需要用到1个开源的 库,这个后面也会说下的. 工程目录: 1. MainActivity.java public class MainActivity extends Fragme ...
- Android中ViewPager的使用
我们在一个apk中第一次開始的时候,会有一个guide界面.一般使用ViewPager来完毕. 布局文件例如以下: <? xml version="1.0" encoding ...
- android 中 ViewPager 的平常用法 ViewPager+ Views
延续前面几个的经常用到的ViewPager, 直接加载各种不同的 View 工程目录: 代码: public class ViewActivity extends Activity { // 每个Vi ...
- Android中ViewPager如何设置不能通过屏幕左右滑动来切换页面
//很多时候,我想禁止用户通过屏幕的左右滑动来切换界面!如何实现! //创建一个类继承viewpager,实现 onTouchEvent 和 onInterceptTouchEvent方法,都 ...
- Android中ViewPager动态创建的ImageView铺满屏幕
ImageView imageView=new ImageView(context); imageView.setScaleType(ScaleType.FIT_XY);//铺满屏幕
随机推荐
- cannot determine the location of the vs common tools folder
问题:打开"VS2010开发人员命令提示后",上面提示"cannot determine the location of the vs common tools fold ...
- Genymotion创建下载模拟器的时候出现Unable to create Genymotion virtual devices:Connection timeout错误
如图,如果Genymotion创建下载模拟器的时候出现Unable to create Genymotion virtual devices:Connection timeout错误,具体解决方法如下 ...
- elasticsearch-查询
使用如下语句创建一个名字为:user_document,别名为user的索引 PUT:http://localhost:9200/user_document { "settings" ...
- BZOJ3218 UOJ#77 A+B Problem(最小割+主席树)
竟然在BZOJ上拿了Rank1太给力啦. p.s.:汗,一发这个就被一堆人在2月27号强势打脸-- 传送门(BZOJ) 传送门(UOJ) 说说这道题目吧: 首先是说说这个构图吧.因为有选择关系,我们很 ...
- 基于VC的声音文件操作(四)
(五)读取wav的实例 跟据WAVE文件的格式,实现了读取双声道立体声数据的例子如下: BYTE * GetData(Cstring *pString) //获取声音文件数据的函数,pString参数 ...
- c++ 时间类型详解 time_t
Unix时间戳(Unix timestamp),或称Unix时间(Unix time).POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00 ...
- win server服务安装
从一台机子的服务移到我的测试环境中: 1.copy 100pC上的服务目录(d:\...)到13PC中
- android wifi SWOL低功耗模式
1 睡眠模式RX代码流程 ar_wal_rx_patch.c::patch_rx_process_recv_status//调用rx_ctxt->data_ind_handler -> d ...
- ImageView
ImageView支持的XML属性及相关方法 XML属性 相关方法 说明 android:adjustViewBounds setAdjustViewBounds(boolean) 是否调整自己的边界 ...
- 《理解 ES6》阅读整理:函数(Functions)(六)Purpose of Functions
明确函数的双重作用(Clarifying the Dual Purpose of Functions) 在ES5及更早的ES版本中,函数调用时是否使用new会有不同的作用.当使用new时,函数内的th ...