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);
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值