主要方法:
setLayoutManager:设置显示方式,有LinearLayoutManager(像ListView一样的纵向列表布局),有GridLayoutManager(网格布局),有StaggeredLayoutManager(瀑布流)
setItemAnimator:设置Item的增加删除动画,系统有提供默认的DefaultItemAnimator()
addItemDecoration:添加分割线。可自定义分割线类型。
使用步骤:
跟ListView类似的:画Item布局,添加RecycleView控件,复写Adapter。不同的是复写RecycleView.Adapter要复写ViewHolder的一些方法,RecyclerView要求必须使用ViewHolder。<ViewHolder的主要的作用,实际上是通过成员变量存储对应的convertView中需要操作的子View,避免每次findViewById,从而提升运行的效率。>
比如:在Adapter中新建内部类:MyViewHolder extends ViewHolder
在该类的构造函数中findViewByid来找到item布局中的控件,如:
class MyViewHolder extends RecyclerView.ViewHolder{ public MyViewHolder(View view){ super(view); tv = (TextView) view.findViewById(R.id.id_num); } }
复写onCreateViewHolder(),在这里来加载Item布局
@Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder viewHolder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_layout,parent,false)); return viewHolder; }
复写onBindViewHolder(),在这里为View填充数据,以及为Item添加点击事件等
@Override public void onBindViewHolder(HomeAdapter.MyViewHolder holder, int position) { holder.tv.setText(mData.get(position)); }
Adapter基本写好,还可以加入一些addItem或者removeItem的方法。
接下来就是如何使用了:
一些常规代码,如:声明并find到RecyclerView,声明adapter,设置LayoutManager
// mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); // mRecyclerView.setLayoutManager(new GridLayoutManager(this,4)); // mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));
设置(添加、删除)动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
设置适配器,Ok了
要添加分割线的话可以参考大神文章http://blog.csdn.net/lmj623565791/article/details/45059587,这个可以用,但是个人觉得这样还是太麻烦了,还不如直接在xml上margin做文章来设置空隙。
设置点击事件
添加接口:
public interface OnItemClickLitener{ void onItemClick(View view, int position); void onItemLongClick(View view , int position); }
添加设置点击事件的方法:
private OnItemClickLitener mOnItemClickLitener; public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) { this.mOnItemClickLitener = mOnItemClickLitener; }
@Override public void onBindViewHolder(final MyViewHolder holder, int position) { holder.textView.setText(mDatas.get(position).getTitle()); if (mOnItemClickListener != null){ holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { int pos = holder.getLayoutPosition(); mOnItemClickListener.onItemClick(view , pos); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { int pos = holder.getLayoutPosition(); mOnItemClickListener.onItemLongClick(view , pos); return false; } }); } }
注意,这里更新数据集不是用adapter.notifyDataSetChanged()而是 notifyItemInserted(position)与notifyItemRemoved(position),否则没有动画效果。