安卓APP_ 布局(8) —— 基于 RecyclerView 的 ViewPager2翻页

摘自:安卓APP_ 布局(8) —— 基于 RecyclerView 的 ViewPager2翻页
作者:丶PURSUING
发布时间: 2021-04-20 15:37:54
网址:https://blog.csdn.net/weixin_44742824/article/details/115803077

viewpager2 是对RecyclerView 的封装(所以viewpager2 自带懒加载方案),相对于viewpager,在实际项目中,更推荐使用viewpager2 。

实现效果

目前来说跟viewpager一毛一样

在这里插入图片描述

(1)创建viewpager2

activity_main.xml中,更改为LinearLayout布局,再创建viewpager2布局。
在这里插入图片描述

如果找不到viewpager2,则需要添加依赖:
在这里插入图片描述

(2)构建viewPage2专属adapter

viewPage的显示需要适配别的数据,相当于一个容器,在容器中显示什么数据需要用户在使用的时候去适配。

在下图中,先是通过find创建viewPage2对象,然后用.setAdapter设置适配器。

Adapter类实例化了一个对象,并把这个对象作为适配器设置的传入参数,如下图:
在这里插入图片描述

接下来就是要定义一个Adapter类,这个类专门用于适配viewPage2
在这里插入图片描述
这个Adapter类要继承于RecyclerView.Adapter,并实现其里面的全部方法:(alt+enter选择继承)
在这里插入图片描述实现如下图的方法:
在这里插入图片描述

(3)定义要适配的界面

创建一个新的布局

在这里插入图片描述
如下图:
在这里插入图片描述
当前UI框架如下图:
在这里插入图片描述

其实现在ViewPager已经实现了左滑右滑,只是要对Adapter进行操作。

定义一个内部类去封装RecyclerView.ViewHolder返回的数据,这个内部类为ViewPagerViewHolder,将要替换RecyclerView.ViewHolder
在这里插入图片描述


传入泛型
在这里插入图片描述

按住ctrl点进Adapter看看,发现是拓展自ViewHolder的一个泛型,就是传入的参数要是ViewHolder的一个泛型。
在这里插入图片描述
正是上面创建的内部类ViewPagerViewHolder。更改为传入泛型后,报错了,更改掉即可。
在这里插入图片描述
至此,adpter雏形就完成了。


(4)解析界面

解析要适配的xml
在这里插入图片描述
再解析xml里面的具体内容,分别是Layout和Textview.
在这里插入图片描述

(5)绑定不同的页面数据实现左右切换

绑定内容
在这里插入图片描述实现绑定
在这里插入图片描述

数据怎么变化,未来可以使用架构MVP,MVM,MVC,这些架构有专门传递数据的值。

具体细节在代码中体现

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //为名为viewPage2的布局实例化一个对象
        ViewPager2 viewPager2 = findViewById(R.id.viewPage2);
        //实例化一个Adapter对象
        ViewPager2Adapter viewPager2Adapter = new ViewPager2Adapter();
        //设置名为viewPage2的布局的Adapter
        viewPager2.setAdapter(viewPager2Adapter);
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

activity_main.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:orientation="vertical">

    <androidx.viewpager2.widget.ViewPager2
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/viewPage2"
        android:background="#ffff00"/>

</LinearLayout>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

item_pager.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/container">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tvTitle"
        android:layout_centerInParent="true"
        android:textColor="#ff4532"
        android:textSize="40dp"
        android:text="hello"/>

</RelativeLayout>

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

item_pager.xml

/*为什么ViewPagerAdapter继承的会是RecyclerView.Adapter呢?
  因为点进类ViewPager2发现其实就是对RecyclerView的适配,有很多RecyclerView的影子*/
public class ViewPager2Adapter extends RecyclerView.Adapter <ViewPager2Adapter.ViewPagerViewHolder>{

    private List<String> titles = new ArrayList<>();
    private List<Integer> colors = new ArrayList<>();

    //构造方法:适配页面的数据(在viewPage初始化的时候就要初始化ArrayList)
    public ViewPager2Adapter(){
        titles.add("chen");
        titles.add("li");
        titles.add("chen");
        titles.add("mei");
        titles.add("wo");
        titles.add("shuai");

        colors.add(R.color.white);
        colors.add(R.color.teal_700);
        colors.add(R.color.teal_200);
        colors.add(R.color.purple_700);
        colors.add(R.color.purple_500);
        colors.add(R.color.purple_200);
    }

    @NonNull
    @Override
    //这个方法返回的是类 ViewPagerViewHolder 所对应的一个对象,必须是一个java代码
    //怎样创建一个view呢:解析xml。
    public ViewPagerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //解析xml        这个view来自哪里呢?用下面的解析器进行解析
        return new ViewPagerViewHolder(LayoutInflater.from
                (parent.getContext()).inflate(R.layout.item_pager,parent,false));
    }

    @Override
    //绑定不同的页面数据,适配不同的内容,让item_pager.xml的数据动态变化   position可以标识item
    public void onBindViewHolder(@NonNull ViewPagerViewHolder holder, int position) {
        holder.mTv.setText(titles.get(position));
        //R.color.white传送的是资源id,所以要用setBackgroundResource,而不是setBackgroundColor
        holder.mContainer.setBackgroundResource(colors.get(position));
    }

    @Override
    //滚动的页面数量
    public int getItemCount() {
        //多出实际值程序闪退
        return 6;
    }

    //定义一个内部类去封装RecyclerView.ViewHolder返回的数据
    class ViewPagerViewHolder extends RecyclerView.ViewHolder{
        //这个ViewPagerViewHolder正是用于解析item_pager.xml的
        TextView mTv;
        RelativeLayout mContainer;

        //实现构造函数
        public ViewPagerViewHolder(@NonNull View itemView) {
            super(itemView);
            //解析id为container的item_pager.xml根布局:RelativeLayout
            mContainer = itemView.findViewById(R.id.container);
            //解析item_pager.xml下的TextView
            mTv = itemView.findViewById(R.id.tvTitle);
        }
    }
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在使用ViewPager2嵌套RecyclerView时,建议使用FragmentStateAdapter来设置ViewPager2的适配器,并在每个Fragment中使用RecyclerView。这样可以确保在滑动ViewPager2时,RecyclerView能够正确地重用并显示不同的数据。 同时,由于RecyclerView默认会拦截滑动事件,导致ViewPager2的滑动失效,因此需要在RecyclerView中禁用滑动事件的拦截。可以通过设置RecyclerView的NestedScrollingEnabled属性为false来实现,即recyclerView.setNestedScrollingEnabled(false)。 另外,还需要在RecyclerView的Adapter中实现getItemCount()和getItemViewType()方法,并根据需要显示不同的布局类型。在使用多个RecyclerView的情况下,建议使用不同的ViewType来避免布局重复和数据错乱等问题。 总之,正确地使用ViewPager2和RecyclerView嵌套需要考虑多方面的因素,包括适配器、布局、事件处理等等。需要仔细思考和实践,才能达到最佳效果。 ### 回答2: ViewPager2 是 Android 系统中的一个控件,可以用来创建包含多个页面的用户界面。而 RecyclerView 则是一个用于显示大量数据列表的控件。嵌套 ViewPager2 和 RecyclerView 可以带来更加丰富的用户界面和更好的交互体验。 在将 RecyclerView 嵌套到 ViewPager2 中时,需要注意以下几点: 1. 使用 FragmentStateAdapter 或 RecyclerView.Adapter ViewPager2 中的每一页都可以是一个 Fragment 或 View,我们可以使用 FragmentStateAdapter 或 RecyclerView.Adapter 作为 ViewPager2 的数据源。如果我们使用 RecyclerView.Adapter,可以创建多个 RecyclerView,每个 RecyclerView 显示不同的数据列表,而每个列表可以是独立的数据流。而使用 FragmentStateAdapter,我们可以创建不同的 Fragment,每个 Fragment 显示自己独立的数据流。 2.设置recyclerView为可滑动 当我们将 RecyclerView 嵌套在 ViewPager2 中时,需要为 RecyclerView 设置合适的滑动方式。默认情况下,RecyclerView 会拦截 ViewPager2 的滑动事件,导致 ViewPager2 的滑动失效。我们可以使用 setNestedScrollingEnabled 方法为 RecyclerView 开启嵌套滑动,或使用 ViewPager2.OnPageChangeCallback 监听 ViewPager2 的滑动事件,并通过调用 RecyclerView 的 scrollBy 和 scrollToPosition 方法使得 RecyclerView 能够正确滑动。 3.注意 RecyclerView布局 在将 RecyclerView 嵌套在 ViewPager2 中时,需要给 RecyclerView 设置适当的布局,以免出现滑动冲突、数据显示过大等问题。我们可以对 RecyclerView 进行水平或垂直的滚动,但需要注意 RecyclerView布局高度。 综上,ViewPager2 和 RecyclerView 的组合可以带来更加丰富和高效的用户界面和交互体验。它可以用于显示各种类型的列表数据,并通过 ViewPager2 的分页显示功能提供更好的用户体验。但在使用时如上文所述,需要注意一些细节问题。 ### 回答3: ViewPager2和RecyclerView都是Android中常用的控件之一。ViewPager2是一个可滑动的容器,常用于页面之间的切换和滑动;RecyclerView是一个高度可定制的列表工具,可用于呈现大量数据,并提供了很多的回收和性能优化功能。 在某些场景下,需要ViewPager2嵌套RecyclerView来实现滑动和展示数据的需求,这种需求可能出现在新闻客户端中,每个tab对应一种类型的新闻,每种类型的新闻数据量很大。这时候就可以考虑使用ViewPager2嵌套RecyclerView来优化用户体验和性能。 具体的实现方法如下: 1、创建一个Activity或Fragment来承载ViewPager2; 2、在ViewPager2中添加多个Fragment,每个Fragment都对应一个tab,包含一个RecyclerView; 3、在Fragment中创建一个合适的适配器类Adapter; 4、在Adapter中重写onCreateViewHolder、onBindViewHolder和getItemCount等方法,并将RecyclerView需要的数据进行绑定; 5、在使用RecyclerView时考虑合适的数据源和异步加载等优化。将RecyclerView中的数据源从Main Thread中移除,使用异步线程进行数据的加载和显示; 6、在ViewPager2中添加TabLayout用于切换不同的Fragment。 需要注意的是,ViewPager2嵌套RecyclerView能够实现数据的高效切换和渐变。为了更好地优化性能,应该尽量减少RecyclerView的嵌套层数,并考虑分页加载等策略来优化加载速度和性能。 总之,ViewPager2嵌套RecyclerView是一种常用的Android开发技术,可以使用它来优化用户体验和性能,提高应用的质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值