RecyclerView是support-v7中提供的新的滑动组件,最低兼容到API11。RecyclerView可实现的功能类似ListView、GridView以及已废弃的Gallery。我们可以用RecyclerView很快速的实现复杂的列表布局。
RecyclerView优势在于:低耦合高内聚。主要优点有:1.RecyclerView封装了viewholder的回收和复用;RecyclerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View;3.提供一种插拔式的体验,高度解耦,针对一个Item的显示RecyclerView专门抽取出了相应的类,来控制Item的显示;3.可以控制Item增删的动画,可以通过ItemAnimator这个类来进行控制。
RecyclerView的使用方法
1. 添加相关依赖
gradle4之前的版本:
compile 'com.android.support:recyclerview-v7:27.1.1'
gradle4 :
implementation'com.android.support:recyclerview-v7:27.1.1'
2.在XML文件中添加RecyclerView布局代码
3.在Activity中绑定RecyclerView控件并设置布局管理器以及adapter
Activity
public class RVDemoActivity extends Activity {
@BindView(R.id.listview)
RecyclerView listview;
private MyRecyclerViewAdapter myRecyclerViewAdapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rvd_demo);
ButterKnife.bind(this);
//设置RecyclerView管理器
listview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
//设置添加或删除item时的动画,这里使用默认动画
listview.setItemAnimator(new DefaultItemAnimator());
//初始化适配器
myRecyclerViewAdapter = new MyRecyclerViewAdapter(getLists(16));
listview.setAdapter(myRecyclerViewAdapter);
}
private List getLists(int count){
List list=new ArrayList<>();
for (int i=0;i
Adapter
package com.my.learn.code.listview.adapter;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.my.learn.code.view.R;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
public class MyRecyclerViewAdapter extends RecyclerView.Adapter {
private Context context;
private List list;
public MyRecyclerViewAdapter(List list) {
this.list = list;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view;
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_rvd, parent, false);
this.context = parent.getContext();
return new DemoHolder(view);
}
public class DemoHolder extends RecyclerView.ViewHolder {
@BindView(R.id.name)
TextView name;
public DemoHolder(View view) {
super(view);
ButterKnife.bind(this, itemView);
}
public void showView(int position, String item) {
name.setText(item);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
// holder.showView(holder.getAdapterPosition(), this.list.get(position));
DemoHolder demoHolder = (DemoHolder) holder;
demoHolder.showView(holder.getAdapterPosition(), this.list.get(position));
}
@Override
public int getItemCount() {
return list.size();
}
}
item_rvd.xml
运行效果如下图:
这样一个简单的RecyclerView demo就完成了, 下面重点说一下
recyclerView.setLayoutManager(LayoutManager layoutManager)
setLayoutManager可以使用三个类:
一、LayoutMananger子类LinearLayoutManager
一般使用LinearLayoutManager的两种构造方法
第一种构造方法:
new LinearLayoutManager(Context context)
参数传上下文环境,默认的是垂直布局。
第二种构造方法:
new LinearLayoutManager( Context context, int orientation, boolean reverseLayout)
第一个参数传上下文环境;第二个参数传布局显示方式,布局的显示方式有两种:LinearLayoutManager.VERTICAL(垂直显示)和LinearLayoutManager.HORIZONTAL(水平显示);第三个参数为布尔值是否反转,是否翻转的意思是,比如第二个参数是LinearLayoutManager.VERTICAL,如果不翻转就是数据从上到下加载,如果翻转就是从下到上加载。
二、LayoutManager的子类StaggeredGridLayoutManager
构造方法:
new StaggeredGridLayoutManager(int spanCount,int orientation)
使用错列的布局,指定两个参数,一个是要显示的列数spanCount,一个是显示的方向orientation。
三、LinearLayoutManager 的子类GridLayoutManager
GridLayoutManager更像是LinearLayoutManager和StaggeredGridLayoutManager结合体,可以设置列数,又可以设置显示方向以及设置页面的加载数据是否反转;
第一种构造方法:
new GridLayoutManager(Context context, int spanCount)
第一个参数为上下文环境,第二个显示列数,默认显示垂直布局。
第二种构造方法:
new GridLayoutManager( Context context, int spanCount, int orientation, boolean reverseLayout)
第一个参数为上下文环境,第二个显示列数,第三个参数为方向,第四个参数为是否反转。
最后推荐一个强大的RecyclerAdapter:BRVAH。它能节约开发者大量的开发时间,集成了大部分列表常用需求解决方案。