一、RecycleView
1.1 什么是RecycleView
Recyclerview是可以展示大量数据 ,重视回收和复用的view的一种控件;
RecyclerView是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字Recyclerview即回收view也可以看出。RecyclerView 支持 线性布局、网格布局、瀑布流布局 三种,而且同时还能够控制横向还是纵向滚动。
1.2RecycleView的用法是什么?
实现如图效果:
纵向排列 布局文件:
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>
- 创建实体类(如果有需求)代码如下:
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;
}
}
- 创建适配器
直接继承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);
}
}
}
- 在活动中创建并设置适配器
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的基本使用
实现效果:右划或者左滑可以查看图片
同样和RecycleView一样
布局文件:
- 主布局文件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>
- 创建子项布局文件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代码:
- 创建实体类(如果有需求)
public class AddressBook {
private int imageId;
public AddressBook( int imageId){
this.imageId=imageId;
}
public int getImageId() {
return imageId;
}
}
- 创建适配器
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);
}
}
}
- 在活动中创建并设置适配器
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 );
}
}
}