Android Viewpager2与RecycleView

本文介绍了如何在Android应用中使用RecyclerView实现线性、网格和瀑布流布局,包括创建实体类、适配器和设置布局管理器。展示了从引入控件到完成项目的详细步骤。

RecycleView简介

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

 RecycleView纵向排列

布局

步骤就是
1. 在主布局中引入控件
2. 编写好子项布局
布局第一步:主要是在主布局中引入RecyclerView控件。
<?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=".MainActivity2">

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rv_show"
        />
</LinearLayout>
布局第二步:创建子布局,然后在子布局中,写好自己的子项布局(需要新建 .xml 的文件)
<?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:orientation="vertical"
    android:layout_width="match_parent"
    android:background="#15D2EA"
    android:padding="10dp"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/img_zys"
        android:layout_width="50dp"
        android:layout_height="50dp"
        />
    <TextView
        android:id="@+id/tv_zys"
        android:layout_width="50dp"
        android:gravity="center"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>

代码

步骤就是
1. 编写实体类
2. 创建适配器
3. 在主活动中使用
代码第一步:编写实体类
这个主要是看你想做一个怎么样的项目来定,在本课程,做一个左边显示图标图片,右边显示名字的简
单项目,就需要名字与图片id
public class Zys {
    int img_zys;
    String tv_zys;

    public Zys(int img_zys, String tv_zys) {
        this.img_zys = img_zys;
        this.tv_zys = tv_zys;
    }

    public int getImg_zys() {
        return img_zys;
    }

    public String getTv_zys() {
        return tv_zys;
    }
}

然后创建适配器

public class ZysAdapter extends RecyclerView.Adapter<ZysAdapter.ViewHolder> {
    private List<Zys> list;

    public ZysAdapter(List<Zys> list) {
        this.list = list;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Zys zys = list.get(position);
        holder.img_zys.setImageResource(zys.getImg_zys());
        holder.tv_zys.setText(zys.getTv_zys());
        holder.img_zys.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), zys.getImg_zys()+"被点击", Toast.LENGTH_SHORT).show();
            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        ImageView img_zys;
        TextView tv_zys;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            img_zys=itemView.findViewById(R.id.img_zys);
            tv_zys=itemView.findViewById(R.id.tv_zys);
        }
    }
}

然后在主类中使用

public class MainActivity9 extends AppCompatActivity {
    private String[] arr={"壹","贰","叁","肆","伍","陆","柒","捌"};
    private int[] imags={R.mipmap.one,R.mipmap.two,R.mipmap.three,R.mipmap.four,R.mipmap.five,R.mipmap.six,R.mipmap.seven,R.mipmap.eight};
    private List<Zys> list = new ArrayList<>();
    private RecyclerView rv_show;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main9);
        init();
        shou=findViewById(R.id.shou);
        rv_show=findViewById(R.id.rv_show);
        initData();
        ZysAdapter addressAdapter = new ZysAdapter(list);
//此处为线性布局
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        rv_show.setLayoutManager(layoutManager);
        rv_show.setAdapter(addressAdapter);

    }

    private void initData() {
        for (int i = 0; i < arr.length; i++) {
            Zys address=new Zys(imags[i],arr[i]);
            list.add(address);
        }

    }

}

 RecycleView横向排列

只需要在主类中加上如下代码

//此处为线性布局
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(RecyclerView.HORIZONTAL);
        rv_show.setLayoutManager(layoutManager);

RecycleView表格布局

public class MainActivity9 extends AppCompatActivity {
    private String[] arr={"壹","贰","叁","肆","伍","陆","柒","捌"};
    private int[] imags={R.mipmap.one,R.mipmap.two,R.mipmap.three,R.mipmap.four,R.mipmap.five,R.mipmap.six,R.mipmap.seven,R.mipmap.eight};
    private List<Zys> list = new ArrayList<>();
    private RecyclerView rv_show;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main9);
        init();
        shou=findViewById(R.id.shou);

        initData();
        ZysAdapter addressAdapter = new ZysAdapter(list);
        GridLayoutManager layoutManager = new GridLayoutManager(this,4);
        rv_show.setLayoutManager(layoutManager);
        shou.setPageTransformer(compositePageTransformer);
        shou.setAdapter(colororAdapter);

    }

    private void initData() {
        for (int i = 0; i < arr.length; i++) {
            Zys address=new Zys(imags[i],arr[i]);
            list.add(address);
        }

    }

}

Viewpager2

概述
ViewPager2 是基于 RecyclerView 实现的,自然继承了 RecyclerView 的众多优点,并且针对
ViewPager 存在的问题做了优化。
支持垂直方向的滑动且实现极其简单。
完全支持 RecyclerView 的相关配置功能。
支持多个 PageTransformer
支持 DiffUtil,局部数据刷新和 Item 动画。
支持模拟用户滑动与禁止用户操作。
1. 布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:id="@+id/rel"
    android:layout_height="match_parent">


    <TextView
        android:id="@+id/textView"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="24sp"
        android:textStyle="bold" />
</RelativeLayout>
2. Adapter
因为 ViewPager2 是基于 RecyclerView 的,所以在使用上与 RecyclerView 的使用基本一致,而且
Adapter 用的也是 RecyclerView.Adapter
public class ColororAdapter extends RecyclerView.Adapter<ColororAdapter.Holder> {
    private List<Integer> colors;

    public ColororAdapter(List<Integer> colors) {
        this.colors = colors;
    }

    @NonNull
    @Override
    public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new Holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.cloror,parent,false));
    }

    @Override
    public void onBindViewHolder(@NonNull Holder holder, int position) {
        int i=position%4;
        holder.textView.setText("item"+i);
        holder.con.setBackgroundColor(colors.get(i));
    }

    @Override
    public int getItemCount() {
        return Integer.MAX_VALUE;
    }

    public class Holder extends RecyclerView.ViewHolder {
        RelativeLayout con;
        TextView textView;
        public Holder(@NonNull View itemView) {
            super(itemView);
            con=itemView.findViewById(R.id.rel);
            textView=itemView.findViewById(R.id.textView);
        }
    }
}

主类代码

public class MainActivity9 extends AppCompatActivity {
    private List<Zys> list = new ArrayList<>();
    private RecyclerView rv_show;
    private ViewPager2 shou;
    private List<Integer> colors=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main9);
        init();
        shou=findViewById(R.id.shou);
        ColororAdapter colororAdapter = new ColororAdapter(colors);
        CompositePageTransformer compositePageTransformer = new CompositePageTransformer();
        compositePageTransformer.addTransformer(new MarginPageTransformer(20));
        compositePageTransformer.addTransformer(new ScaleInTransformer());

        shou.setOffscreenPageLimit(1);
        View childAt = shou.getChildAt(0);
        if (childAt!=null && childAt instanceof RecyclerView){
            childAt.setPadding(100,0,100,0);
            ((RecyclerView) childAt).setClipToPadding(false);
        }
        shou.setPageTransformer(compositePageTransformer);
        shou.setAdapter(colororAdapter);
    }

    }
    private void init(){
        colors.add(Color.BLUE);
        colors.add(Color.YELLOW);
        colors.add(Color.GREEN);
        colors.add(Color.RED);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值