标签:
最近上了Study Jams的课程,布置了一个小作业。为了完成小作业,自己就顺便尝试用了一下RecycleView。
从整体上看RecyclerView的架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人惊艳的效果。
需要先添加依赖
compile 'com.android.support:recyclerview-v7:23.2.1'
这是一个抽象类,好在系统提供了3个实现类:
mRecyclerView.setHasFixedSize(true);//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);//可以设置滚动的方向,默认竖直滚动
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(mAdapter);
GridLayoutManager layoutManager =new GridLayoutManager(this,3);//3行
layoutManager.setOrientation(OrientationHelper.HORIZONTAL);//水平
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(mAdapter); StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL);//表示2列,并且是竖直方向的瀑布流
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(mAdapter);
抽象类,需自己实现类
也是一个抽象类,好在系统为我们提供了一种默认的实现类DefaultItemAnimator()。
// 设置item动画 mRecyclerView.setItemAnimator(new DefaultItemAnimator());
更新数据集不是用adapter.notifyDataSetChanged()而是notifyItemInserted(position)与notifyItemRemoved(position)
你可以通过mRecyclerView.addOnItemTouchListener去监听然后去判断手势, 也可以通过adapter中自己去提供回调。
这里使用第二种,使用接口回调的方法。
在Adapter类中添加以下的接口:
public interface OnRecyclerViewItemClickListener {
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
private OnRecyclerViewItemClickListener mOnItemClickListener = null;
public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
this.mOnItemClickListener = listener;
}在Adapter类中的onBindViewHolder()方法回调接口 //点击事件回调
if(mOnItemClickListener != null){
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickListener.onItemClick(holder.itemView,position);
}
});
//longClick
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
mOnItemClickListener.onItemLongClick(holder.itemView,position);
return false;
}
});
}在需要实现RecycleView点击事件的类中实现接口mAdapter.setOnItemClickListener(this);
需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。主要实现三个方法:
我们创建的ViewHolder必须继承RecyclerView.ViewHolder,这个RecyclerView.ViewHolder的构造时必须传入一个View,这个View相当于我们ListView getView中的convertView (即:我们需要inflate的item布局需要传入)。还有一点,ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,假设屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。
//自定义的ViewHolder,持有每个Item的的所有界面元素
class ViewHolder extends RecyclerView.ViewHolder {
ImageView mAvatar;
TextView mName;
public ViewHolder(View view) {
super(view);
mAvatar = (ImageView) view.findViewById(R.id.img_avatar);
mName = (TextView) view.findViewById(R.id.txt_name);
}
}
标签:
原文地址:http://blog.csdn.net/u013082948/article/details/51353166