目录
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()方法获取控件的实例(在本例
子中获取的是ImageView和TextView)。
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);
}
}