ViewPager和ViewPager2

2023-10-09 17:15
文章标签 viewpager viewpager2

本文主要是介绍ViewPager和ViewPager2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.ViewPager简单使用:

   1)定义Layout

  <androidx.viewpager.widget.ViewPagerandroid:id="@+id/viewpager"android:layout_width="match_parent"android:layout_height="match_parent"/>

      2)初始化View

  private void initViews() {viewPager = findViewById(R.id.viewpager);List<String> list = new ArrayList<>();for (int i = 0; i < 10; i++) {list.add("pos: " + i);}views = new ArrayList<>();for (int i = 0; i < list.size(); i++) {View view = LayoutInflater.from(this).inflate(R.layout.layout_item, null);TextView textView = view.findViewById(R.id.textview);textView.setText(list.get(i));views.add(view);}MyPageAdapter pageAdapter = new MyPageAdapter(this, views);viewPager.setAdapter(pageAdapter);}

    3)PageAdapter

  

public class MyPageAdapter extends PagerAdapter {private Context context;private List<View> views;public MyPageAdapter(Context context, List<View> list) {this.context = context;this.views = list;}@Overridepublic int getCount() {if (views == null) {return 0;} else {return Integer.MAX_VALUE;}}@Overridepublic boolean isViewFromObject(@NonNull View view, @NonNull Object object) {return view == object;}@NonNull@Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {int index = position % views.size();Log.e("nyz", "instantiateItem " + position);Log.e("nyz", "childCount " + container.getChildCount());container.addView(views.get(index));return views.get(index);}@Overridepublic void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {Log.e("nyz", "destroyItem " + position);Log.e("nyz", "childCount " + container.getChildCount());container.removeView((View) object);}}

2.ViewPager2的简单使用

 1)layout引入ViewPager2

 <androidx.viewpager2.widget.ViewPager2android:id="@+id/viewpager2"android:layout_width="match_parent"android:layout_height="match_parent" />

   2)Activity中。

  List<String> list = new ArrayList<>();for (int i = 0; i < 10; i++) {list.add("pos: " + i);}viewPager2 = findViewById(R.id.viewpager2);//设置ViewPager是纵向滚动,还是横向滚动
//        viewPager2.setOrientation(ViewPager2.ORIENTATION_VERTICAL);viewPager2.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);viewPager2.setAdapter(new MyPageAdapter2(this, list));

 3)Adapter,定义Adapter和定义RecycleView的Adapter是一样的。因为在ViewPager2内部有一个RecycleView。

public class MyPageAdapter2 extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private Context context;private List<String> list;public MyPageAdapter2(Context context, List<String> list) {this.context = context;this.list = list;}@NonNull@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.layout_item, parent,false);MyViewHolder viewHolder = new MyViewHolder(view);return viewHolder;}@Overridepublic void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {((MyViewHolder) holder).update(list.get(position));}@Overridepublic int getItemCount() {return list.size();}class MyViewHolder extends RecyclerView.ViewHolder {private TextView textView;public MyViewHolder(@NonNull View itemView) {super(itemView);textView = itemView.findViewById(R.id.textview);}public void update(String str) {textView.setText(str);}}
}

4)java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)

 Process: com.example.viewpager, PID: 8447java.lang.IllegalStateException: Pages must fill the whole ViewPager2 (use match_parent)at androidx.viewpager2.widget.ViewPager2$4.onChildViewAttachedToWindow(ViewPager2.java:270)at androidx.recyclerview.widget.RecyclerView.dispatchChildAttached(RecyclerView.java:7561)at androidx.recyclerview.widget.RecyclerView$5.addView(RecyclerView.java:860)at androidx.recyclerview.widget.ChildHelper.addView(ChildHelper.java:107)at androidx.recyclerview.widget.RecyclerView$LayoutManager.addViewInt(RecyclerView.java:8601)at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8559)at androidx.recyclerview.widget.RecyclerView$LayoutManager.addView(RecyclerView.java:8547)at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1641)at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)at android.view.View.layout(View.java:23750)at android.view.ViewGroup.layout(ViewGroup.java:6525)at androidx.viewpager2.widget.ViewPager2.onLayout(ViewPager2.java:527)at android.view.View.layout(View.java:23750)at android.view.ViewGroup.layout(ViewGroup.java:6525)at androidx.swiperefreshlayout.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:689)at android.view.View.layout(View.java:23750)at android.view.ViewGroup.layout(ViewGroup.java:6525)at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)at android.view.View.layout(View.java:23750)at android.view.ViewGroup.layout(ViewGroup.java:6525)at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)at android.widget.FrameLayout.onLayout(FrameLayout.java:270)at android.view.View.layout(View.java:23750)at android.view.ViewGroup.layout(ViewGroup.java:6525)at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:536)at android.view.View.layout(View.java:23750)at android.view.ViewGroup.layout(ViewGroup.java:6525)at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)at android.widget.FrameLayout.onLayout(FrameLayout.java:270)at android.view.View.layout(View.java:23750)at android.view.ViewGroup.layout(ViewGroup.java:6525)at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1829)at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1673)at android.widget.LinearLayout.onLayout(LinearLayout.java:1582)at android.view.View.layout(View.java:23750)at android.view.ViewGroup.layout(ViewGroup.java:6525)at android.widget.FrameLayout.layoutChildren(FrameLayout.java:332)at android.widget.FrameLayout.onLayout(FrameLayout.java:270)at com.android.internal.policy.DecorView.onLayout(DecorView.java:880)at android.view.View.layout(View.java:23750)at android.view.ViewGroup.layout(ViewGroup.java:6525)at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:4082)at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3501)at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2410)at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9402)at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1193)at android.view.Choreographer.doCallbacks(Choreographer.java:945)at android.view.Choreographer.doFrame(Choreographer.java:851)at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1175)at android.os.Handler.handleCallback(Handler.java:938)

  出现上面的异常的解决方案:

1)解决方案1 在onCreateViewHolder时不能使用下面的方式:

     View view = LayoutInflater.from(context).inflate(R.layout.layout_item,null);

     而应该使用下面的方式,就不会出现上面的异常:

    View view = LayoutInflater.from(context).inflate(R.layout.layout_item, parent,false);

2)解决方案2 动态设置宽高

  View view = LayoutInflater.from(context).inflate(R.layout.layout_item,null);ViewGroup.LayoutParams layoutParams =new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);view.setLayoutParams(layoutParams);

通过上面的异常信息,可以看出来Choreographer的调用流程:

FrameDisplayEventReceiver.run--doFrame---doCallbacks--CallbackRecord.run--TraversalRunnable.run--doTraversal--performTraversals--performLayout--layout--

然后就是熟悉的onLayout onMeasure onDraw.

可以参考另外一篇介绍编舞者的文章:

Choreographer--编舞者源码分析_choreographer 源码分析-CSDN博客

 at android.view.View.layout(View.java:23750)at android.view.ViewGroup.layout(ViewGroup.java:6525)at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:4082)at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3501)at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2410)at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9402)at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1193)at android.view.Choreographer.doCallbacks(Choreographer.java:945)at android.view.Choreographer.doFrame(Choreographer.java:851)at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1175)at android.os.Handler.handleCallback(Handler.java:938)

代码下载:

https://download.csdn.net/download/niuyongzhi/88408862

这篇关于ViewPager和ViewPager2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/174350

相关文章

ViewPager+fragment实现切换页面(一)

如今的很多应用中都是下面有一排按钮,点击可以切换页面,滑动也可以切换页面。下面就来简单的实现这个功能。 思路 首先肯定是会用到viewpager这个控件,为了能够向下兼容,最好用v4包下的viewpager,Activity要继承FragmentActivity 其次用一个集合来存储所有的fragment页面在设置viewpager的适配器时,把存储fragment页面的list集合传入ada

安卓中的fragment与viewPager的使用问题的解决

最近使用viewPager,结合fragment使用,发现fragment的周期将不符合他的原有的周期流程,多个fragment将会产生错位问题。       通过研究相关代码,发现fragment的切换实际调用的函数为setUserVisibleHint,通过在其中重写方法,将会达到fragment正确切换的效果。       public void setUserVisible

ViewPager切换动画PageTransformer的使用

Android从3.0开始添加了属性动画后,诸多难以实现的动画都可以轻松解决了,v4包下的ViewPager控件当然也不例外,相对于非常平庸的默认切换动画,Google官方给我们展示了两个动画例子:DepthPageTransformer和ZoomOutPageTransformer,比较炫。 实际上我们也可以通过实现ViewPager.PageTransformer接口来做出完全不同的切换

Android-ViewPager禁止左滑(右滑)

因为项目需求,要做一个滑动月份选择的效果,而且滑动到当前月就要禁止左滑到下一个月,百度了下,大多是禁止左右双向滑动,满足不了效果,继续百度了解了下 触摸事件的分发,我决定自己写一个试试,结果效果很好。开始出现了一个bug,来回滑任然能左滑过去,结果发现是仅把按下时作为上一次坐标,来和当前坐标对比,肯定会有不满足的情况。这个问题已经解决了,直接看代码吧。     package

ParallaxViewPager:ViewPager的视差背景效果

源码: Java代码   import android.annotation.SuppressLint;  import android.content.Context;  import android.graphics.Bitmap;  import android.graphics.BitmapFactory;  import android.graphics.Canvas

Android 动态更新Viewpager+fragment完美解决方案

最近遇到个问题,一直没有找到很好的解决方案,今天终于解决了。 Viewpager嵌套多个Fragment 现在我要改变fragment中的数据。 这个非常的简单,网上有很多答案都能解决。 改变Viewpager的数量,也就是说我要动态的增加或者删除Viewpager的页面数量。 这个就非常操蛋了。 查遍资料,才找到解决办法。写下来备忘。 从FragmentPagerAdapter的运行机制

viewpager 无网络的时候滑动异常

不知道大家有没有遇到过这种情况,就是框架是viewpager+fragment的架构。然后呢,fragment里面是webview.一般情况下,当没有网的时候,webviwe会说什么找不到网页,然后很长的一个地址显示在webview上。你能够滑很长。一般没网的时候我们会找个东西盖在上面。如: 如果没网的话,你会发现滑动的时候,滑动不灵敏,因为webwiew在搞鬼。怎么办? 1.重写canS

Android-ViewPager使用示例(二)

根据上一篇Android-ViewPager使用示例 本篇介绍导航点 工程目录结构 核心代码段: Guide.java package com.example.viewpager;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle

ImageLoader进阶(结合ListView、ViewPager使用)

代码下载地址 点击打开链接即可下载 先看主页面的布局ac_home.xml,里面只有一个Button,进入ListView界面展现图片列表 <?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android"android:l

android 学习之Fragment+ViewPager实现页面左右滑动标签页

ViewPager 结合Fragment实现一个Activity里包含多个可滑动的标签页,每个标签页可以有独立的布局及响应。 如下所示。 我们可以借助TabLayout来实现顶部导航。Activity布局文件如下: <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.a