Material Design控件使用总结之RecyclerVi
参考:
张鸿洋博客
Android RecyclerView 使用完全解析 体验艺术般的控件
为RecyclerView打造通用Adapter 让RecyclerView更加好用
介绍
RecyclerView是Android5.0的新控件,可以用来替代ListView,用来显示一个列表。作为小白,对新出的控件还是很喜欢的,毕竟在设计上真的进步很多,符合审美。RecyclerView相对于ListView有更好的扩展性,默认实现了View的复用,支持局部刷新,实现Item动画、拖拽、侧滑等功能会更容易。但是没有addHeaderView()和addFooterView()来添加头部视图和底部视图,对Item的点击也没有直接的接口,需要自己实现,而这些在ListView中很容易实现。RecyclerView的出现并不是完全取代了ListView,他们各有自身的优点和缺点,根据需要选择就好。
一、基本使用
1、作为新增控件,需要在build.gradle中添加相应的依赖库。和TabLayout导入依赖库的方法相同。
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support:design:26.+' // 导入所有新控件
compile 'com.android.support:recyclerview-v7:26.+' //只导入recyclerview
此处导入所有的新控件,也可以只导入recyclerview,选择其一即可
代码:
布局文件:
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Activity:
RecyclerView通过设置 LayoutManage定制不同风格的视图,如水平滚动、竖直列表瀑布流。
通过ItemAnimator为条目增加动画
通过ItemDecoreation为条目设置分割线
recyclerView = (RecyclerView) findViewById(R.id.recycler);
recyclerView.setLayoutManager(new
LinearLayoutManager(this, LinearLayoutManager.VERTICAL,false));
adapter = new LinearRecyclerAdapter(this);
Adapter:
RecyclerView遵循Adapter中的ViewHolder模式
public class LinearRecyclerAdapter extends RecyclerView.Adapter<LinearRecyclerAdapter.ViewHolder> {
private Context context;
private List<String> datas;
public LinearRecyclerAdapter(Context context) {
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_list,parent,false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.tv.setText(datas.get(position));
}
@Override
public int getItemCount() {
return datas.size();
}
public void addData(List<String> mDatas) {
datas = new ArrayList<>();
this.datas = mDatas;
}
static class ViewHolder extends RecyclerView.ViewHolder{
TextView tv;
public ViewHolder(View itemView) {
super(itemView);
tv = itemView.findViewById(R.id.tv_item_content);
}
}
}
运行之后,是这个样子的,基本的列表功能实现了

当然由于RecyclerView的扩展性较好,当你想改变布局的时候,只需修改LayoutManager即可。例如GridView的效果,只需在setLayoutManager()时传入GridLayoutManager即可。
recyclerView.setLayoutManager(new GridLayoutManager(this,4));
ps:备注小白的困惑(再传入不同的LayoutManage时,对各个参数不理解,可查看官网的文档或尝试查看源码帮助理解)。
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,
StaggeredGridLayoutManager.HORIZONTAL));
二、添加分割线和点击事件
添加分割线
对于列表形式的下划线,可以通过在Item布局中添加个View来实现,如果是网格布局或者瀑布流布局,通过画线的形式实现会比较繁琐。如果项目中有很多需要线的时候,会增加代码的冗余度。
Android中可以使用recyclerView.addItemDecoration();来加入分割线,addItemDecoration()里面传入一个ItemDecoration对象,ItemDecoration是一个抽象类,自定义该类的子类就可以实现画线了,

具体参看Android RecyclerView 使用完全解析 体验艺术般的控件
添加点击事件
RecyclerView并没有提供Item的点击事件,需要我们自己实现,也许是考虑到扩展性吧,例如你只想点击Item中的某个组件而不是整个Item之类的,可以直接在adapter中为组件设置点击事件,不用监听整个Item的点击。如果监听整个Item的点击,在adapter中提供回调就可以实现了
代码:
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, final int position)
{
holder.tv.setText(mDatas.get(position));
// 如果设置了回调,则设置点击事件
if (mOnItemClickLitener != null)
{
holder.itemView.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
int pos = holder.getLayoutPosition();
mOnItemClickLitener.onItemClick(holder.itemView, pos);
}
});
holder.itemView.setOnLongClickListener(new OnLongClickListener()
{
@Override
public boolean onLongClick(View v)
{
int pos = holder.getLayoutPosition();
mOnItemClickLitener.onItemLongClick(holder.itemView, pos);
return false;
}
});
}
}
在Activity中,通过adapter.setOnItemClickListener()重写方法,即可实现点击事件。