RecycleView和ViewPager2

目录

RecycleView

RecycleView简介

RecycleView纵向排列

首先在主布局中引入RecyclerView控件。

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

编写实体类

创建适配器

在主活动中使用

RecycleView横向排列

只需要在设置布局管理器的时候添加一个横向布局即可

RecycleView网格布局

RecycleView的点击事件

第一步,在适配器中的onBindViewHolder方法中给视图获取监听

第二步,在ViewHolder中设置视图

ViewPager2

ViewPager2使用步骤

首先在主布局中引入ViewPager2控件。

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

编写实体类

创建适配器

在主活动中使用


RecycleView

RecycleView简介

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

1.容器性质的控件

2.用于大量数据展示的新控件

RecycleView纵向排列

首先在主布局中引入RecyclerView控件。

<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"
    android:orientation="vertical"
    tools:context=".MainActivity">

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

</LinearLayout>

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

<?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="horizontal"
    android:padding="10dp"
    android:layout_height="wrap_content">
    <View
        android:layout_width="2dp"
        android:layout_height="match_parent"
        android:background="#FFFFFF" />
    <ImageView
        android:id="@+id/iv_img"
        android:layout_width="50dp"
        android:layout_height="50dp" />
    <TextView
        android:id="@+id/tv_tx"
        android:layout_width="300dp"
        android:layout_gravity="center_vertical"
        android:textSize="20dp"
        android:layout_height="wrap_content" />
</LinearLayout>

编写实体类

package com.wzk.recyclerview.model;

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

创建适配器

package com.wzk.recyclerview.adapter;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.wzk.recyclerview.R;
import com.wzk.recyclerview.model.AddressBook;

import java.util.List;

public class AddressAdapter extends RecyclerView.Adapter<AddressAdapter.ViewHolder> {
    //存储有多少条数据然后在getItemCount方法里做循环
    private List<AddressBook> list;
    public AddressAdapter(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);
        //返回视图
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        //取出list中数据写进视图中
        AddressBook addressBook = list.get(position);
        holder.iv_img.setImageResource(addressBook.getImgid());
        holder.tv_tx.setText(addressBook.getName());
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), addressBook.getName()+"被点击", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public int getItemCount() {

        return list.size();
    }

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


}

在主活动中使用

package com.wzk.recyclerview;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

import com.wzk.recyclerview.adapter.AddressAdapter;
import com.wzk.recyclerview.model.AddressBook;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    //写要填的数据
    private String[] names={"男一","男二","男三","男四","女一","女二","女三","女四"};
    private int[] imgs={R.mipmap.men,R.mipmap.men,R.mipmap.men,R.mipmap.men,R.mipmap.nv,R.mipmap.nv,R.mipmap.nv,R.mipmap.nv};
    private List<AddressBook> list=new ArrayList<>();
    private RecyclerView rv_address;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //整合数据,存进list中
        initData();
        //根据id获取控件
        rv_address=findViewById(R.id.rv_address);
        //把适配器拿出来用,把list传进适配器中
        AddressAdapter adapter=new AddressAdapter(list);
        //在设置适配器之前设置布局管理器
        LinearLayoutManager layoutManager=new LinearLayoutManager(this);
        rv_address.setLayoutManager(layoutManager);

        //给控件用适配器赋值
        rv_address.setAdapter(adapter);
    }

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

RecycleView横向排列

只需要在设置布局管理器的时候添加一个横向布局即可

        //在设置适配器之前设置布局管理器
        LinearLayoutManager layoutManager=new LinearLayoutManager(this);
        layoutManager.setOrientation(RecyclerView.HORIZONTAL);

RecycleView网格布局

将布局管理器设置为GridLayoutManager

        //根据id获取控件
        rv_address=findViewById(R.id.rv_address);
        //把适配器拿出来用,把list传进适配器中
        AddressAdapter adapter=new AddressAdapter(list);
        //在设置适配器之前设置布局管理器
        GridLayoutManager layoutManager=new GridLayoutManager(this,3);
        rv_address.setLayoutManager(layoutManager);

        //给控件用适配器赋值
        rv_address.setAdapter(adapter);

RecycleView的点击事件

RecyclerView的点击事件比ListView的点击事件更精确。 假如我是用的是ListView,那么我点击子项的时候,无论我点击图片还是文字,他都只知道,我点击了 子项。但是如果使用的是RecyclerView,他就可以准确地判断出我点击了文字还是图片! 修改代码其实也很简单,只用修改适配器里的代码。主要是给最外层布局和图片加了点击事件,所以点 击图片的时候会有Toast,点击文字的时候因为没有给文字注册点击事件,所以会被最外层布局捕捉到, 相当于点击了最外层布局。

第一步,在适配器中的onBindViewHolder方法中给视图获取监听

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(view.getContext(), addressBook.getName()+"被点击", Toast.LENGTH_SHORT).show();
            }
        });

第二步,在ViewHolder中设置视图

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

ViewPager2

ViewPager2继承于RecycleView

ViewPager2使用步骤

首先在主布局中引入ViewPager2控件。

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

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

<RelativeLayout 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:id="@+id/lay_rl"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity2">
    <TextView
        android:id="@+id/tv_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="666"/>
</RelativeLayout>

编写实体类

public class Swiper {
    private int scolor;
    private String title;

    public Swiper(int scolor, String title) {
        this.scolor = scolor;
        this.title = title;
    }

    public int getScolor() {
        return scolor;
    }

    public String getTitle() {
        return title;
    }
}

创建适配器

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 inflate = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_swiper, parent, false);
        ViewHolder viewHolder = new ViewHolder(inflate);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        int i=position%4;
        Swiper swiper = list.get(i);
        holder.lay_rl.setBackgroundColor(swiper.getScolor());
        holder.tv_text.setText(swiper.getTitle());
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{
        RelativeLayout lay_rl;
        TextView tv_text;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            lay_rl=itemView.findViewById(R.id.lay_rl);
            tv_text=itemView.findViewById(R.id.tv_text);
        }
    }
}

在主活动中使用

因为ViewPager2是横向滑动排序的,所以不用添加布局管理器

public class MainActivity2 extends AppCompatActivity {
    ViewPager2 vp_swi;
    private List<Swiper> colors=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        //整合数据
        initColors();
        //根据控件获取id
        vp_swi=findViewById(R.id.vp_swi);
        //适配器
        SwiperAdapter viewPagerAdapter = new SwiperAdapter(colors);
        //给控件添加适配器
        vp_swi.setAdapter(viewPagerAdapter);
    }

    private void initColors() {
        Swiper swiper=new Swiper(Color.BLUE,"666");
        colors.add(swiper);
        Swiper swiper2=new Swiper(Color.RED,"777");
        colors.add(swiper2);
        Swiper swiper3=new Swiper(Color.GREEN,"888");
        colors.add(swiper3);
        Swiper swiper4=new Swiper(Color.YELLOW,"888");
        colors.add(swiper4);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值