Android中的RecycleView和ViewPager2

目录

RecycleView

        1.RecycleView是什么?

        2.RecycleView分为几种布局?

        3.RecycleView的用法是什么?(纵向布局)

                1.布局文件:

                        1.主布局文件中添加,并且设置id;

                        2.创建子项布局文件,.xml文件,并对其内部控件设置id

                2.代码:

                        1.编写实体类

                        2.创建适配器

                        3.在主活动中使用

        4.横向布局

        5.网格布局

        6.点击事件

  ViewPager2 

       1. ViewPager2是什么?

        2.ViewPager2的用法

                1.主布局文件中添加,并且设置id;

                2.创建子项布局文件,.xml文件,并对其内部控件设置id

                3.创建实体类

                4.创建适配器

                5.在主活动中使用

         3. PageTransformer


RecycleView

        1.RecycleView是什么?

                它是一种容器性质的控件,用于大量数据展示的控件

        2.RecycleView分为几种布局?

                线性布局,网格布局,瀑布流布局三种,而且同时还能够控制横向还是纵向滚

动。

        3.RecycleView的用法是什么?(纵向布局)

                1.布局文件:

                        1.主布局文件中添加<RecycleView>,并且设置id

<?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/rectangles"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

                        2.创建子项布局文件,.xml文件,并对其内部控件设置id

<?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:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:background="#7EE5F3"
    android:padding="5dp">



    <ImageView
        android:id="@+id/iv_img"
        android:layout_width="50dp"
        android:layout_height="50dp"
        app:srcCompat="@mipmap/touxiang07" />

    <TextView
        android:layout_gravity="center"
        android:id="@+id/tv_name"
        android:textSize="16sp"
        android:textColor="@color/white"
        android:layout_marginStart="5dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>

                2.代码:

                        1.编写实体类

                                先创建一个model包放实体类文件

public class AddressBook {

    public  int imgID;
    private String name;

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


    public String getName() {
        return name;
    }

    public int getImg() {
        return imgID;
    }

}

                        2.创建适配器

                               

1. 创建一个新类:AddressBookAdapter继承RecyclerView.Adapter,并且将泛型指定为
AddressBookAdapter.ViewHolder。 一开始这么写会报错,因为ViewHolder是一个内部类,我们 还没有定义。所以接下来我们就定义内部类。这个内部类的作用主要是通过传入的一个view
从而获取RecyclerView子项的最外层布局,然后通过findViewById()方法获取控件的实例(在本例 子中获取的是ImageViewTextView)。
2. 定义全局变量mList,生成构造函数。 这个构造函数是用来把要展示的数据源(图片、名字)传进 来,并赋值给mList
3. 重写onCreateViewHolder()方法 这个函数主要是用来加载子项布局(addressbook_item),然后 创建ViewHolder实例并把子项布局传入到构造函数中,最后返回ViewHolder实例。
4. 重写onBindViewHolder()方法 这个方法是用来对传入的子项布局进行赋值的,也就是说当子项布 局被传入进来,是它让布局有了名字、图片。它会在每个布局被滚动到屏幕的时候执行。在本例子 中,是通过position参数得到当前项的AddressBook实例,然后再把数据设置到ViewHolder ImageView和TextView里。
5. 重写getItemCount()方法 这个方法主要是用来返回数据源的长度,也就是告诉RecyclerView他有多 少个子项
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.hopu.day15_recyclerview.R;
import com.hopu.day15_recyclerview.model.AddressBook;
import java.util.List;


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

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


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

    

    @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.getImg());
        holder.tv_name.setText(addressBook.getName());
    }

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

                        3.在主活动中使用

1. 获取RecyclerView的实例
2. 创建LinearLayoutManager对象
3. 创建AddressBookAdapter实例
4. 模拟数据
5. 将模拟数据传入AddressBookAdapter的构造函数中
6. 调用setAdapter()方法完成适配器设置
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.hopu.day15_recyclerview.adapter.AddressBookAdaper;
import com.hopu.day15_recyclerview.model.AddressBook;
import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    // 模拟从服务器返回的结果数据
    private String[] names={"a","d","c","d","e","f","g","h","i","j"};
    private int[] imgs={R.mipmap.touxiang08,R.mipmap.touxiang11,R.mipmap.touxiang14,R.mipmap.touxiang15,R.mipmap.touxiang16,R.mipmap.touxiang17,R.mipmap.touxiang19,R.mipmap.touxiang22,R.mipmap.touxiang23,R.mipmap.touxiang25};
    // 组合的数据存放的地方
    private List<AddressBook> list=new ArrayList<>();
    private RecyclerView rectangles;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();

        rectangles=findViewById(R.id.rectangles);
        AddressBookAdaper addressBookAdaper=new AddressBookAdaper(list);
        //设置布局管理器
        LinearLayoutManager layoutManager=new LinearLayoutManager(this);
        rectangles.setLayoutManager(layoutManager);
        rectangles.setAdapter(addressBookAdaper);
    }

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

        4.横向布局

                

public class MainActivity extends AppCompatActivity {
    // 模拟从服务器返回的结果数据
    private String[] names={"a","d","c","d","e","f","g","h","i","j"};
    private int[] imgs={R.mipmap.touxiang08,R.mipmap.touxiang11,R.mipmap.touxiang14,R.mipmap.touxiang15,R.mipmap.touxiang16,R.mipmap.touxiang17,R.mipmap.touxiang19,R.mipmap.touxiang22,R.mipmap.touxiang23,R.mipmap.touxiang25};
    // 组合的数据存放的地方
    private List<AddressBook> list=new ArrayList<>();
    private RecyclerView rectangles;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();

        rectangles=findViewById(R.id.rectangles);
        AddressBookAdaper addressBookAdaper=new AddressBookAdaper(list);
        //设置布局管理器
        LinearLayoutManager layoutManager=new LinearLayoutManager(this);
        //只需要增加方向即可
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        rectangles.setLayoutManager(layoutManager);
        rectangles.setAdapter(addressBookAdaper);
    }

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

        5.网格布局

public class MainActivity extends AppCompatActivity {
    // 模拟从服务器返回的结果数据
    private String[] names={"a","d","c","d","e","f","g","h","i","j"};
    private int[] imgs={R.mipmap.touxiang08,R.mipmap.touxiang11,R.mipmap.touxiang14,R.mipmap.touxiang15,R.mipmap.touxiang16,R.mipmap.touxiang17,R.mipmap.touxiang19,R.mipmap.touxiang22,R.mipmap.touxiang23,R.mipmap.touxiang25};
    // 组合的数据存放的地方
    private List<AddressBook> list=new ArrayList<>();
    private RecyclerView rectangles;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();

        rectangles=findViewById(R.id.rectangles);
        AddressBookAdaper addressBookAdaper=new AddressBookAdaper(list);
        //设置布局管理器
        GridLayoutManager LayoutManager = new GridLayoutManager(this,3);
        rectangles.setLayoutManager(layoutManager);
        rectangles.setAdapter(addressBookAdaper);
    }

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

        6.点击事件

                点击事件是在适配器中onBindViewHolder方法中完成的

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

    List<Work3> list;
    public Work8A(List<Work3> list){
        this.list=list;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Work3 work3=list.get(position);
        holder.tv_name.setText(work3.getName());
        holder.tv_name.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), work3+"被点击", Toast.LENGTH_SHORT).show();
            }
        });
        holder.iv_img.setImageResource(work3.getImgID());
        holder.iv_img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), work3.getImgID()+"被点击", Toast.LENGTH_SHORT).show();
            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        View view;
        ImageView iv_img;
        TextView tv_name;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            iv_img = itemView.findViewById(R.id.iv_img);
            tv_name = itemView.findViewById(R.id.tv_name);
        }
    }
}

  ViewPager2 

       1. ViewPager2是什么?

                他也是一个容器性质的控件,是基于RecyclerView 实现的,自然继承了 RecyclerView 的众多优点,并且针对 ViewPager 存在的问题做了优化。

        2.ViewPager2的用法

                1.主布局文件中添加<ViewPager2>,并且设置id

<?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="300dp"
    tools:context=".MainActivity3">

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

                2.创建子项布局文件,.xml文件,并对其内部控件设置id

                        我这里准备设置背景颜色和字体,所以给他俩设置了id

<?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/rl_1">


    <TextView
        android:id="@+id/tv_1"
        android:layout_marginLeft="50dp"
        android:clipChildren="false"
        android:layout_marginRight="50dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="TextView" />
</RelativeLayout>

                3.创建实体类

public class Work6 {
    private int scolor;
    private String name;
    public Work6(int scolor,String name){
        this.scolor=scolor;
        this.name=name;
    }

    public int getScolor() {
        return scolor;
    }

    public String getName() {
        return name;
    }
}

                4.创建适配器

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.hopu.day15_recyclerview_homework.R;
import com.hopu.day15_recyclerview_homework.model.Work6;
import java.util.List;

public class Work5A extends RecyclerView.Adapter<Work5A.ViewHolder> {
    List<Work6> list;
    public Work5A(List<Work6> list){
        this.list=list;
    }

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

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Work6 work5=list.get(position);
        holder.tv_1.setText(work5.getName());
        holder.rl_1.setBackgroundColor(work5.getScolor());

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView tv_1;
        RelativeLayout rl_1;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tv_1 = itemView.findViewById(R.id.tv_1);
            rl_1 = itemView.findViewById(R.id.rl_1);
        }
    }
}

                5.在主活动中使用

public class MainActivity4 extends AppCompatActivity {

    List<Work6> list=new ArrayList<>();
    private ViewPager2 vp_1;

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

        vp_1=findViewById(R.id.vp_1);
        Work5A work5A=new Work5A(list);
        vp_1.setAdapter(work5A);
        a();
    }

    private void a() {
        
        Work6 pager1=new Work6(Color.BLUE,"蓝色");
        list.add(pager1);
        Work6 pager2=new Work6(Color.YELLOW,"黄色");
        list.add(pager2);
        Work6 pager3=new Work6(Color.RED,"红色");
        list.add(pager3);
        Work6 pager4=new Work6(Color.GREEN,"绿色");
        list.add(pager4);
    }

}

         3. PageTransformer

           setPageTransformer 是 ViewPager 中就提供的方法,用于设置页面切换动画效果。相较于
ViewPager ViewPager2 setPageTransformer 的功能要更加的强大,除了可以设置页面切换动 画,还可以用来设置页面边距而且支持同时设置多个 PageTransformer 。
               MarginPageTransformer
        ViewPager2 中取消了在 ViewPager 中的 setPageMargin() 方法,改为通过提供的
MarginPageTransformer 来设置页面间距。
                具体代码设置边距
        调边距是在里面主活动里面设置的
public class MainActivity5 extends AppCompatActivity {

    List<Work6> list=new ArrayList<>();
    private ViewPager2 vp_2;

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

        vp_2=findViewById(R.id.vp_2);
        Work5A work5A=new Work5A(list);
        //设置页面边距
        MarginPageTransformer pageTransformer = new MarginPageTransformer(20);
        vp_2.setPageTransformer(pageTransformer);
        vp_2.setAdapter(work5A);
        a();
    }

    private void a() {
        Work6 pager1=new Work6(Color.BLUE,"蓝色");
        list.add(pager1);
        Work6 pager2=new Work6(Color.YELLOW,"黄色");
        list.add(pager2);
        Work6 pager3=new Work6(Color.RED,"红色");
        list.add(pager3);
        Work6 pager4=new Work6(Color.GREEN,"绿色");
        list.add(pager4);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值