RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好。接下来通过一系列的文章讲解如何使用RecyclerView,彻底抛弃ListView.
介绍:
RecyclerView与ListView原理是类似的:都是仅仅维护少量的View并且可以展示大量的数据集。RecyclerView用以下两种方式简化了数据的展示和处理:
使用LayoutManager来确定每一个item的排列方式。
为增加和删除项目提供默认的动画效果。
你也可以定义你自己的LayoutManager和添加删除动画,RecyclerView项目结构如下:
Adapter:使用RecyclerView之前,你需要一个继承自RecyclerView.Adapter的适配器,作用是将数据与每一个item的界面进行绑定。
LayoutManager:用来确定每一个item如何进行排列摆放,何时展示和隐藏。回收或重用一个View的时候,LayoutManager会向适配器请求新的数据来替换旧的数据,这种机制避免了创建过多的View和频繁的调用findViewById方法(与ListView原理类似)。
目前SDK中提供了三种自带的LayoutManager:
LinearLayoutManager
GridLayoutManager
StaggeredGridLayoutManager
简单来说,RecyclerView 作为一个新的sdk,它的可重构性要比ListView好的多,在以后的开发中可以大量使用。
下面简单说一下使用,
布局文件,简单几句:
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical" />
在布局文件中添加该控件之后,在代码中绑定:
mRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);
//创建默认的线性LayoutManager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
mRecyclerView.setHasFixedSize(true);
//创建并设置Adapter
mAdapter = new MyAdapter(getDummyDatas());
mRecyclerView.setAdapter(mAdapter);
之后便可以定义MyAdapter,从网上看到许多处理adapter的方法,挑一个比较好理解的来说吧:
MyAdapter继承RecyclerView.Adapter
@Override
public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = minflater.inflate(R.layout.item_single_textview, viewGroup, false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
将数据与View绑定,并且可以处理一些动作(这里处理一个点击事件)
@Override
public void onBindViewHolder(MyViewHolder myViewHolder, final int i) {
myViewHolder.tv.setText(mDatas.get(i));
setItemEventClick(myViewHolder);
}
定义setItemEventClick()方法
protected void setItemEventClick(final MyViewHolder myViewHolder) {
if (mOnItemClickListener != null) {
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int layoutPostion = myViewHolder.getLayoutPosition();
mOnItemClickListener.onItemClick(view, layoutPostion);
}
});
myViewHolder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
int layoutPostion = myViewHolder.getLayoutPosition();
mOnItemClickListener.onItemLongClick(view, layoutPostion);
return false;
}
});
}
}
自定义的ViewHolder,持有每个Item的的所有界面元素
class MyViewHolder extends RecyclerView.ViewHolder {
TextView tv;
public MyViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.id_tv);
}
}
写出点击事件的接口,由主页面来处理点击事件
private OnItemClickListener mOnItemClickListener;
public interface OnItemClickListener {
void onItemClick(View view, int postion);
void onItemLongClick(View view, int postion);
}
public void setmOnItemClickListener(OnItemClickListener mOnItemClickListener) {
this.mOnItemClickListener = mOnItemClickListener;
}
以上就是RecyclerView的简单使用,并不是很复杂,在今后的项目中可以尽量多使用该SDK,减少对ListView的使用,可以灵活的控制界面,稍后上传一个对RecyclerView的小Demo加深理解