一、RecycleView

1.1 什么是RecycleView

Recyclerview是可以展示大量数据 ,重视回收和复用的view的一种控件;
RecyclerView是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字Recyclerview即回收view也可以看出。RecyclerView 支持 线性布局、网格布局、瀑布流布局 三种,而且同时还能够控制横向还是纵向滚动。

1.2RecycleView的用法是什么?

实现如图效果:

Android ViewPager2获取fragment android viewpager recyclerview_开发语言

纵向排列 布局文件:
1 .创建主布局activity_main.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:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

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

2.创建子项布局文件addressbook_item.xml,并对其内部控件设置id 代码如下:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"> 
<ImageView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:id="@+id/iv_icon"/> 
<TextView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:id="@+id/tv_name"/> 
</LinearLayout>
  1. 创建实体类(如果有需求)代码如下:
package com.houpu.recycleviewtest.pojo;

public class AddressBook {
    private String name;
    private int imageId;

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

    }
    public String getName() {
        return name;
    }

    public int getImageId() {
        return imageId;
    }
}
  1. 创建适配器
    直接继承RecyclerView.Adapter<AddressBookAdapter.ViewHolder> 然后一一实现
package com.houpu.recycleviewtest.Adapter;

import android.annotation.SuppressLint;
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.houpu.recycleviewtest.R;
import com.houpu.recycleviewtest.pojo.AddressBook;

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

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

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

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

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

    @Override
    public void onBindViewHolder(@NonNull AddressBookAdapter.ViewHolder holder, int position) {
        AddressBook addressBook=list.get(position);
        holder.img_hand.setImageResource(addressBook.getImageId());
        holder.name.setText(addressBook.getName());
    }

    @Override
    public int getItemCount() {
        return list.size();
    }
//这个也要继承RecyclerView.ViewHolder
    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView name;
         ImageView img_hand;
        @SuppressLint("CutPasteId")
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            name= itemView.findViewById(R.id.tv_name);
            img_hand=itemView.findViewById(R.id.img_hand);
        }
    }
}
  1. 在活动中创建并设置适配器
package com.houpu.recycleviewtest;

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

import android.os.Bundle;

import com.houpu.recycleviewtest.Adapter.AddressBookAdapter;
import com.houpu.recycleviewtest.pojo.AddressBook;

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

public class MainActivity extends AppCompatActivity {
    // 模拟从服务器返回的结果数据
     private String[] names = {"庄周","花木兰","刘禅","猪八戒","孙悟空","盘古","蒙 恬","后羿","李元芳","诸葛亮","小黑子","坤坤"};
     //设置图片
     private int[] imgs = {R.mipmap.a1,R.mipmap.a2,R.mipmap.a3,R.mipmap.a4,R.mipmap.a5,R.mipmap.a6,R.mipmap.a7,R.mipmap.a8,R.mipmap.a9,R.mipmap.a10,R.mipmap.a11,R.mipmap.a12};

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

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

        initdDay();

        tv_te=findViewById(R.id.tv_te);
        RecyclerView recyclerView=findViewById(R.id.tv_te);
         LinearLayoutManager layoutManager=new LinearLayoutManager(this);
         recyclerView.setLayoutManager(layoutManager);
         AddressBookAdapter fruitAdapter=new AddressBookAdapter(list);
         recyclerView.setAdapter(fruitAdapter);
     }
//for循环输出数据
    private void initdDay() {
        for (int i = 0; i < names.length; i++) {
            AddressBook addressBook=new AddressBook(names[i],imgs[i]);
            list.add(addressBook);
        }
    }
}

二、 Viewpager2

2.1、什么是ViewPager?

布局管理器允许左右翻转带数据的页面,你想要显示的视图可以通过实现PagerAdapter来显示。这个类其实是在早期设计和开发的,它的API在后面的更新之中可能会被改变,当它们在新版本之中编译的时候可能还会改变源码。
ViewPager经常用来连接Fragment,它很方便管理每个页面的生命周期,使用ViewPager管理Fragment是标准的适配器实现。最常用的实现一般有FragmentPagerAdapter和FragmentStatePagerAdapter。
ViewPager是android扩展包v4包中的类,这个类可以让我们左右切换当前的view。我们先来聊聊ViewPager的几个相关知识点:
1、ViewPager类直接继承了ViewGroup类,因此它一个容器类,可以添加其他的view类
2、ViewPager类需要一个PagerAdapter适配器类给它提供数据(这点跟ListView一样需要数据适配器Adater)

3、ViewPager经常和Fragment一起使用,并且官方还提供了专门的FragmentPagerAdapterFragmentStatePagerAdapter类供Fragment中的ViewPager使用

2.2、什么是ViewPager2

ViewPager2 是基于 RecyclerView 实现的,自然继承了 RecyclerView 的众多优点,并且针对ViewPager 存在的问题做了优化。

  • 支持垂直方向的滑动且实现极其简单。
  • 完全支持 RecyclerView 的相关配置功能。
  • 支持多个 PageTransformer。
  • 支持 DiffUtil,局部数据刷新和 Item 动画。
  • 支持模拟用户滑动与禁止用户操作。

原理: viewpager2 内部实现原理是使用recycleview加LinearLayoutManager实现竖直滚动,其实可以理解为对recyclerview的二次封装

2.3 ViewPager2的基本使用

实现效果:右划或者左滑可以查看图片

Android ViewPager2获取fragment android viewpager recyclerview_java_02


同样和RecycleView一样

布局文件:

  1. 主布局文件activity_main.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:layout_width="match_parent"
    android:orientation="vertical"
    android:id="@+id/ly_roy"
    android:layout_height="match_parent"
    tools:context=".MainActivity2">


    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/rv_view"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
  1. 创建子项布局文件viewpg2_item.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="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/iv_icon"
        android:scaleType="fitXY"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        app:srcCompat="@mipmap/a1" />
</LinearLayout>

java代码:

  1. 创建实体类(如果有需求)
public class AddressBook {
    private int imageId;

    public AddressBook( int imageId){
    this.imageId=imageId;

    }

    public int getImageId() {
        return imageId;
    }
}
  1. 创建适配器
public class AddressBookAdapter extends RecyclerView.Adapter<AddressBookAdapter.ViewHolder> {

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

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

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

    @Override
    public void onBindViewHolder(@NonNull AddressBookAdapter.ViewHolder holder, int position) {
        AddressBook addressBook=list.get(position);
        holder.iv_icon.setImageResource(addressBook.getImageId());
        holder.tv_name.setText(addressBook.getName());
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        ImageView iv_icon;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            iv_icon=itemView.findViewById(R.id.iv_icon);
        }
    }
}
  1. 在活动中创建并设置适配器
public class IndexFragment extends Fragment {
//    声明容器
    private ViewPager2 vp2_slide;
//    设置数据
    private int[] imgs={R.mipmap.a1,R.mipmap.a2,R.mipmap.a3,R.mipmap.a4,R.mipmap.a5,R.mipmap.a6};
    private List<Travel> list=new ArrayList<>();


    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    public IndexFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment indexFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static IndexFragment newInstance(String param1, String param2) {
        IndexFragment fragment = new IndexFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //关闭list 防止点击其他页面 列表一直刷新
        list.clear();
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view= inflater.inflate(R.layout.fragment_index, container, false);


        initData();
        rv_view= view.findViewById(R.id.rv_view);
        Traveladapter traveladapter= new Traveladapter(list);
        vp2_slide.setAdapter(traveladapter);

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