IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android【RecycleView,Viewpager2】 -> 正文阅读

[移动开发]Android【RecycleView,Viewpager2】

1.RecycleView

1.1简介

Android 5.0 开始,谷歌公司推出了一个用于 大量数据展示的新控件 RecylerView ,可以用来代替
传统的 ListView ,更加强大和灵活。
RecyclerView 是一个强大的滑动组件,与经典的 ListView 相比,同样拥有 item 回收复用的功能,这
一点从它的名字 Recyclerview 即回收 view 也可以看出。
RecyclerView 支持 线性布局 网格布局 瀑布流布局 三种,而且同时还能够控制横向还是纵向滚
动。

1.2使用流程

1.2.1布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_address"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

?1.2.2创建子布局。然后在子布局中,写好自己的子项布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:background="@color/teal_200"
    android:layout_height="60dp">

    <ImageView
        android:id="@+id/iv_img"
        android:layout_width="90dp"
        android:layout_height="30dp"
        android:layout_gravity="center"
        app:srcCompat="@mipmap/baocun01" />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16dp"
        android:gravity="center"
        android:layout_gravity="center"
        android:text="TextView" />

</LinearLayout>

1.2.3?编写实体类

public class AddressBook {

    private String name;
    private int imgid;

    public AddressBook(String name, int imgid) {
        this.name = name;
        this.imgid = imgid;
    }

    public String getName() {
        return name;
    }

    public int getImgid() {
        return imgid;
    }
}

1.2.4创建适配器

?创建一个新类继承RecyclerView.Adapter,并且将泛型指定为 AddressBookAdapter.ViewHolder。 一开始这么写会报错,因为ViewHolder是一个内部类,我们还没有定义。所以接下来我们就定义内部类。这个内部类的作用主要是通过传入的一个参数view,从而获取RecyclerView子项的最外层布局,然后通过findViewById()方法获取控件的实例(在本例 子中获取的是ImageViewTextView)。

然后定义全局变量 List ,生成构造函数。 这个构造函数是用来把要展示的数据源(图片、名字)传进来,并赋值给List
重写 onCreateViewHolder() 方法 这个函数主要是用来加载子项布局( addressbook_item ),然后创建ViewHolder 实例并把子项布局传入到构造函数中,最后返回 ViewHolder 实例。
重写 onBindViewHolder() 方法 这个方法是用来对传入的子项布局进行赋值的,也就是说当子项布
局被传入进来,是它让布局有了名字、图片。它会在每个布局被滚动到屏幕的时候执行。在本例子
中,是通过 position 参数得到当前项的 AddressBook 实例,然后再把数据设置到 ViewHolder
ImageView TextView 里。
重写 getItemCount() 方法 这个方法主要是用来返回数据源的长度,也就是告诉 RecyclerView 他有多
少个子项。
public class AddressBookAdapter extends RecyclerView.Adapter<AddressBookAdapter.ViewHolder> {

    private List<AddressBook> list;

    public AddressBookAdapter(List<AddressBook> list) {
        this.list = list;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.addressbook_item, parent, false);
        ViewHolder viewHolder=new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        AddressBook addressBook=list.get(position);
        //可以在此处设置控件的点击事件
        holder.iv_img.setImageResource(addressBook.getImgid());
        holder.iv_img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), addressBook.getName()+"被点击",Toast.LENGTH_LONG).show();
            }
        });
        holder.tv_name.setText(addressBook.getName());
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView tv_name;
        ImageView iv_img;
        View view;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            view=itemView;
            iv_img = itemView.findViewById(R.id.iv_img);
            tv_name = itemView.findViewById(R.id.tv_name);

        }
    }

}

1.2.5在主活动中使用

public class MainActivity extends AppCompatActivity {

    private String[] name={"周杰伦","胡歌","莉莉娜","李连杰","龙湖东墙","李娜和","联合抗日","联合抗日","联合抗日","联合抗日","联合抗日","联合抗日"};
    private int[] img={R.mipmap.baocun01,R.mipmap.chaxun01,R.mipmap.chengzhong01,R.mipmap.dayin01,R.mipmap.faka01,R.mipmap.guanbi01,R.mipmap.hegezheng01,R.mipmap.quanxuan01,R.mipmap.shaixuan01,R.mipmap.shenhe01,R.mipmap.wenjian01,R.mipmap.xiazai01};

    private List<AddressBook> list=new ArrayList<>();

    private RecyclerView rv_address;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initDate();

        rv_address = findViewById(R.id.rv_address);
        // 设置横,纵向排列
        // 只需要增加方向即可
        rv_address.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));

        AddressBookAdapter adapter=new AddressBookAdapter(list);
        //创建LinearLayoutManager对象
        //设置布局管理器
        //网格布局为GridLayoutManager (GridLayoutManager gridLayoutManager = new GridLayoutManager(this,3);第二个参数为每排个数)
        LinearLayoutManager layoutManager=new LinearLayoutManager(this);

        rv_address.setLayoutManager(layoutManager);

        rv_address.setAdapter(adapter);

    }

    private void initDate() {
        for (int i = 0; i < name.length; i++) {
            AddressBook addressBook=new AddressBook(name[i],img[i]);
            list.add(addressBook);
        }
    }

}

2.Viewpager2

2.1简述

ViewPager2 是基于 RecyclerView 实现的,自然继承了 RecyclerView 的众多优点,并且针对
ViewPager 存在的问题做了优化。
支持垂直方向的滑动且实现极其简单。
完全支持 RecyclerView 的相关配置功能。
支持多个 PageTransformer
支持 DiffUtil ,局部数据刷新和 Item 动画。
支持模拟用户滑动与禁止用户操作。

2.2使用流程

2.2.1布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/vp_swiper"
        android:layout_width="match_parent"
        android:layout_height="300dp" />

</LinearLayout>

??2.2.2创建子布局。然后在子布局中,写好自己的子项布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rv_guide"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <TextView
        android:id="@+id/tv_info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@color/white"
        android:textSize="56dp"/>

</RelativeLayout>

2.2.3?编写实体类

public class Swiper {

    private String info;
    private int colors;

    public Swiper(String info, int colors) {
        this.info = info;
        this.colors = colors;
    }

    public String getInfo() {
        return info;
    }

    public int getColors() {
        return colors;
    }
}

2.2.4创建适配器

public class SwiperAdapter extends RecyclerView.Adapter<SwiperAdapter.ViewHolder> {

    private List<Swiper> list;

    public SwiperAdapter(List<Swiper> list) {
        this.list = list;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.swiper_item, parent, false);
        ViewHolder viewHolder=new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        int i = position  % 3;
        Swiper swiper=list.get(i);
        holder.info.setText(swiper.getInfo());
        holder.colors.setBackgroundColor(swiper.getColors());
    }

    @Override
    public int getItemCount() {
        //实现无限轮播
        return Integer.MAX_VALUE;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView info;
        RelativeLayout colors;

        public ViewHolder(@NonNull View itemView) {

            super(itemView);

            colors = itemView.findViewById(R.id.rv_guide);
            info = itemView.findViewById(R.id.tv_info);

        }
    }

}

2.2.5在主活动中使用

public class MainActivity extends AppCompatActivity {

    private List<Swiper> list=new ArrayList<>();

    private ViewPager2 vp_swiper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initDate();

        vp_swiper = findViewById(R.id.vp_swiper);

        SwiperAdapter swiperAdapter=new SwiperAdapter(list);

        //设置多个 Transformer 就是通过 CompositePageTransformer 实现
的。
        CompositePageTransformer compositePageTransformer=new CompositePageTransformer();
        compositePageTransformer.addTransformer(new MarginPageTransformer(20));
        compositePageTransformer.addTransformer(new ScaleInTransformer());

        vp_swiper4.setOffscreenPageLimit(1); //一屏多页
        View recyclerView = vp_swiper.getChildAt(0);
        if(recyclerView != null && recyclerView instanceof RecyclerView){
            recyclerView.setPadding(100, 0, 100, 0);
            ((RecyclerView) recyclerView).setClipToPadding(false);
        }

        vp_swiper.setPageTransformer(compositePageTransformer);
        vp_swiper.setAdapter(swiperAdapter);

    }

    private void initDate() {
        Swiper swiper=new Swiper("黑色", Color.BLACK);
        list.add(swiper);
        Swiper swiper1=new Swiper("红色", Color.RED);
        list.add(swiper1);
        Swiper swiper2=new Swiper("绿色", Color.GREEN);
        list.add(swiper2);
    }
}

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 10:55:38  更:2022-08-06 10:56:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 4:39:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码