RecycleView简介
从
Android 5.0
开始,谷歌公司推出了一个用于
大量数据展示的新控件
RecylerView
,可以用来代替
传统的
ListView
,更加强大和灵活。
RecyclerView
是一个强大的滑动组件,与经典的
ListView
相比,同样拥有
item
回收复用的功能,这
一点从它的名字
Recyclerview
即回收
view
也可以看出。
RecyclerView
支持
线性布局
、
网格布局
、
瀑布流布局
三种,而且同时还能够控制横向还是纵向滚
动。
RecycleView纵向排列
布局
步骤就是
1.
在主布局中引入控件
2.
编写好子项布局
布局第一步
:主要是在主布局中引入
RecyclerView
控件。
<?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=".MainActivity2">
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rv_show"
/>
</LinearLayout>
布局第二步
:创建子布局,然后在子布局中,写好自己的子项布局(需要新建 .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:orientation="vertical"
android:layout_width="match_parent"
android:background="#15D2EA"
android:padding="10dp"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img_zys"
android:layout_width="50dp"
android:layout_height="50dp"
/>
<TextView
android:id="@+id/tv_zys"
android:layout_width="50dp"
android:gravity="center"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
代码
步骤就是
1.
编写实体类
2.
创建适配器
3.
在主活动中使用
代码第一步
:编写实体类
这个主要是看你想做一个怎么样的项目来定,在本课程,做一个左边显示图标图片,右边显示名字的简
单项目,就需要名字与图片
id
public class Zys {
int img_zys;
String tv_zys;
public Zys(int img_zys, String tv_zys) {
this.img_zys = img_zys;
this.tv_zys = tv_zys;
}
public int getImg_zys() {
return img_zys;
}
public String getTv_zys() {
return tv_zys;
}
}
然后创建适配器
public class ZysAdapter extends RecyclerView.Adapter<ZysAdapter.ViewHolder> {
private List<Zys> list;
public ZysAdapter(List<Zys> list) {
this.list = list;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.zys_item, parent, false);
ViewHolder viewHolder = new ViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Zys zys = list.get(position);
holder.img_zys.setImageResource(zys.getImg_zys());
holder.tv_zys.setText(zys.getTv_zys());
holder.img_zys.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(view.getContext(), zys.getImg_zys()+"被点击", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ImageView img_zys;
TextView tv_zys;
public ViewHolder(@NonNull View itemView) {
super(itemView);
img_zys=itemView.findViewById(R.id.img_zys);
tv_zys=itemView.findViewById(R.id.tv_zys);
}
}
}
然后在主类中使用
public class MainActivity9 extends AppCompatActivity {
private String[] arr={"壹","贰","叁","肆","伍","陆","柒","捌"};
private int[] imags={R.mipmap.one,R.mipmap.two,R.mipmap.three,R.mipmap.four,R.mipmap.five,R.mipmap.six,R.mipmap.seven,R.mipmap.eight};
private List<Zys> list = new ArrayList<>();
private RecyclerView rv_show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main9);
init();
shou=findViewById(R.id.shou);
rv_show=findViewById(R.id.rv_show);
initData();
ZysAdapter addressAdapter = new ZysAdapter(list);
//此处为线性布局
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
rv_show.setLayoutManager(layoutManager);
rv_show.setAdapter(addressAdapter);
}
private void initData() {
for (int i = 0; i < arr.length; i++) {
Zys address=new Zys(imags[i],arr[i]);
list.add(address);
}
}
}
RecycleView横向排列
只需要在主类中加上如下代码
//此处为线性布局
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(RecyclerView.HORIZONTAL);
rv_show.setLayoutManager(layoutManager);
RecycleView表格布局
public class MainActivity9 extends AppCompatActivity {
private String[] arr={"壹","贰","叁","肆","伍","陆","柒","捌"};
private int[] imags={R.mipmap.one,R.mipmap.two,R.mipmap.three,R.mipmap.four,R.mipmap.five,R.mipmap.six,R.mipmap.seven,R.mipmap.eight};
private List<Zys> list = new ArrayList<>();
private RecyclerView rv_show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main9);
init();
shou=findViewById(R.id.shou);
initData();
ZysAdapter addressAdapter = new ZysAdapter(list);
GridLayoutManager layoutManager = new GridLayoutManager(this,4);
rv_show.setLayoutManager(layoutManager);
shou.setPageTransformer(compositePageTransformer);
shou.setAdapter(colororAdapter);
}
private void initData() {
for (int i = 0; i < arr.length; i++) {
Zys address=new Zys(imags[i],arr[i]);
list.add(address);
}
}
}
Viewpager2
概述
ViewPager2
是基于
RecyclerView
实现的,自然继承了
RecyclerView
的众多优点,并且针对
ViewPager
存在的问题做了优化。
支持垂直方向的滑动且实现极其简单。
完全支持
RecyclerView
的相关配置功能。
支持多个
PageTransformer
。
支持
DiffUtil
,局部数据刷新和
Item
动画。
支持模拟用户滑动与禁止用户操作。
1.
布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:id="@+id/rel"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="24sp"
android:textStyle="bold" />
</RelativeLayout>
2. Adapter
因为
ViewPager2
是基于
RecyclerView
的,所以在使用上与
RecyclerView
的使用基本一致,而且
Adapter
用的也是
RecyclerView.Adapter
。
public class ColororAdapter extends RecyclerView.Adapter<ColororAdapter.Holder> {
private List<Integer> colors;
public ColororAdapter(List<Integer> colors) {
this.colors = colors;
}
@NonNull
@Override
public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new Holder(LayoutInflater.from(parent.getContext()).inflate(R.layout.cloror,parent,false));
}
@Override
public void onBindViewHolder(@NonNull Holder holder, int position) {
int i=position%4;
holder.textView.setText("item"+i);
holder.con.setBackgroundColor(colors.get(i));
}
@Override
public int getItemCount() {
return Integer.MAX_VALUE;
}
public class Holder extends RecyclerView.ViewHolder {
RelativeLayout con;
TextView textView;
public Holder(@NonNull View itemView) {
super(itemView);
con=itemView.findViewById(R.id.rel);
textView=itemView.findViewById(R.id.textView);
}
}
}
主类代码
public class MainActivity9 extends AppCompatActivity {
private List<Zys> list = new ArrayList<>();
private RecyclerView rv_show;
private ViewPager2 shou;
private List<Integer> colors=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main9);
init();
shou=findViewById(R.id.shou);
ColororAdapter colororAdapter = new ColororAdapter(colors);
CompositePageTransformer compositePageTransformer = new CompositePageTransformer();
compositePageTransformer.addTransformer(new MarginPageTransformer(20));
compositePageTransformer.addTransformer(new ScaleInTransformer());
shou.setOffscreenPageLimit(1);
View childAt = shou.getChildAt(0);
if (childAt!=null && childAt instanceof RecyclerView){
childAt.setPadding(100,0,100,0);
((RecyclerView) childAt).setClipToPadding(false);
}
shou.setPageTransformer(compositePageTransformer);
shou.setAdapter(colororAdapter);
}
}
private void init(){
colors.add(Color.BLUE);
colors.add(Color.YELLOW);
colors.add(Color.GREEN);
colors.add(Color.RED);
}
}