概述
RecyclerView大家可以通过导入support-v7对其进行使用。相比于ListView,GridView,RecyclerView的使用更加的灵活。
主要有以下几部分组成
- 布局管理器LayoutManager
- 条目动画ItemAnimator
- 条目分割装饰ItemDecoration
该控件并没有提供自己的事件监听接口,需要自己去实现。
基本使用
布局文件
Item布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ff3366"
android:orientation="vertical">
<TextView
android:id="@+id/item_text"
android:textSize="30sp"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
MainActivity布局
?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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
Adapter 的使用
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements View.OnClickListener {
// 常用参数
private Context context; // 上下文
private ArrayList<String> list; // 数据源(使用String做基本演示)
private OnChildClickListener onChildClickListener; // 自己定义的一个内部接口,实现点击事件
private RecyclerView recyclerView; // 所关联的RecyclerView
/**
* 设置条目监听(自定义功能)
*/
public void setOnChildClickListener(OnChildClickListener onChildClickListener) {
this.onChildClickListener = onChildClickListener;
}
/**
* 初始化
*/
public MyAdapter(Context context, ArrayList<String> list) {
this.context = context;
this.list = list;
}
/**
* 当adapter被连接到一个RecyclerView上的时候,为这个RecyclerView提供数据的时候回调该方法
*/
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
this.recyclerView = recyclerView;
}
/**
* 解绑的时候
*/
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView);
this.recyclerView = null;
}
/**
* 必须实现的抽象方法,用来创建一个ViewHolder
* @param parent ViewHolder所处父布局
* @param viewType 条目类型(使用多种条目的是时候使用)
* @return 返回创建的ViewHolder
*/
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.recyler_item, parent,false);
view.setOnClickListener(this);
return new MyViewHolder(view);
}
/**
* 必须实现的抽象方法,绑定该ViewHolder到对应位置上显示的时候,用来初始化条目显示信息
* @param holder 返回该holder(因为有复用)
* @param position 绑定的位置
*/
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.itemText.setText(list.get(position));
}
/**
* 必须实现的抽象方法,返回字条目的数量
*/
@Override
public int getItemCount() {
return list.size();
}
/**
* 可选实现,返回对应位置条目的类型
*/
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
@Override
public void onClick(View view) {
if (recyclerView != null && onChildClickListener != null) {
int position = recyclerView.getChildAdapterPosition(view);
onChildClickListener.onChildClick(recyclerView,view,position,list.get(position));
}
}
/**
* 必须继承RecyclerView.ViewHolder
*/
public static class MyViewHolder extends RecyclerView.ViewHolder{
private final TextView itemText;
/**
* 构造方法中初始化子条目用到的控件
*/
public MyViewHolder(View itemView) {
super(itemView);
itemText = ((TextView) itemView.findViewById(R.id.item_text));
}
}
/**
* 自定义接口,实现点击监听
*/
public interface OnChildClickListener{
void onChildClick(RecyclerView parent,View view,int position,String data);
}
/**
* 移除子条目
*/
public void itemRemoved(int position){
list.remove(position);
// 移除条目数据变更通知,如果使用notifyDataSetChanged(),条目移除动画就会不生效
notifyItemRemoved(position);
}
/**
* 添加子条目
*/
public void addItem(int position,String data){
list.add(position,data);
notifyItemInserted(position);
}
/**
* 改变子条目
*/
public void changeItem(int position , String data){
list.set(position,data);
notifyItemChanged(position);
}
}
默认提供的布局管理器的使用
//线性布局管理器
/**
* 第三個參數:反转布局(聊天窗口使用方便),true是倒序,false正序
*/
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
//网格布局管理器
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 3,LinearLayoutManager.VERTICAL,false);
/**
* 设置占几列(垂直布局),几列(水平布局)
*/
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (position == 0) {
return 3;
}
return 1;
}
});
/**
* 参差不齐的网格布局(瀑布流),子数据大小不一时
*/
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
// 添加布局管理器
recyclerView.setLayoutManager(linearLayoutManager);
// 添加数据适配器
recyclerView.setAdapter(adapter);
分割装饰的使用
// 添加分割线
recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {
/**
* 绘制前准备工作
*/
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
c.drawColor(Color.BLACK);
}
/**
* 在RecyclerView上绘制悬浮物,不能够点击
*/
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
c.drawBitmap(bitmap,400,600,null);
}
/**
* 绘制条目分割装饰
*/
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.set(0,3*parent.getChildAdapterPosition(view),0,3);
}
});
默认动画的使用
DefaultItemAnimator animator = new DefaultItemAnimator();
// 设置为true显示条目改变动画
animator.setSupportsChangeAnimations(true);
// 添加条目动画
recyclerView.setItemAnimator(animator);