Recyclerview已经出来差不多有2年左右了,通过对控件的了解及使用发现Recyclerview与其他控件比较起来具有高度的解耦,异常的灵活的特性。
我们可以通过导入Support-v7包进行使用:
Recyclerview 有充分的定制自由,它可实现以下多种效果:
1.listview横向、纵向数据展示。
2.gridview网格布局数据展示。
3.StaggeredGrid瀑布流式布局数据展示。
想要实现效果,只需要为Recyclerview设置布局管理器及关联adapter就可以显示数据展示效果,其使用代码:
//找到Recyclerview控件
mRecyclerView = findView(R.id.id_recyclerview);
①.listview代码设置:
//设置布局管理器
mRecyclerView.setLayoutManager(new LinearLayoutManager(dataActivity));
//设置adapter
mRecyclerView.setAdapter(adapter)。
一般情况下如果不设置滑动方向,默认是纵向滑动,想要实现横向滑动,只需要在设置布局管理器的地方做更改就可以:
//设置布局管理器
// mRecyclerView.setLayoutManager(new LinearLayoutManager(dataActivity));替换成以下布局就好:
mRecyclerViewsetLayoutManager(new LinearLayoutManager(activity,LinearLayoutManager.HORIZONTAL,false));
②.girdview代码设置:
//设置布局管理器
mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));//只需要更改布局管理器就可实现效果。
//设置adapter
mRecyclerView.setAdapter(adapter)。
③.瀑布流式代码设置:
此效果与gridview效果一致,如果需要实现瀑布流式效果,只需要在adapter的onBindViewHolder
方法中为我们的item设置个随机的高度就可以,当然也支持横向和纵向数据展示:
//设置布局管理器
mRecyclerView.setLayoutManager(
newStaggeredGridLayoutManager(
4,StaggeredGridLayoutManager.VERTICAL));//纵向
//mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.HORIZONTAL));//横向
//设置adapter
mRecyclerView.setAdapter(adapter)。
下面我们来看看adapter的设置方法代码(单纯的使用方法,不含瀑布流式等效果):
public class AttachmentMaterAdapter extends RecyclerView.Adapter<AttachmentMaterAdapter.AttachmentMaterHolder>{
private Context context;
private List<MaterialBean> materLists;
public AttachmentMaterAdapter(Context context,List<MaterialBean> materLists) {
this.context = context;
this.materLists = materLists;
}
@Override
public AttachmentMaterHolderonCreateViewHolder(ViewGroup parent, int viewType) {
View view= LayoutInflater.from(context).inflate(R.layout.material_list_item,null);//此处为引入item的xml文件比较简单就不贴出来了。
AttachmentMaterHolder holder=new AttachmentMaterHolder(view);
return holder;
}
@Override
public void onBindViewHolder(AttachmentMaterHolderholder, int position) {
MaterialBean info=materLists.get(position);
if(info!=null){
holder.icon.setBackgroundResource(info.getIcon());
holder.textView.setText(info.getName());
}
}
@Override
public int getItemCount() {
return materLists.size();
}
public class AttachmentMaterHolder extends ViewHolder{
private ImageView icon;
private TextView textView;
public AttachmentMaterHolder(View itemView) {
super(itemView);
icon= (ImageView) itemView.findViewById(R.id.icon);
textView= (TextView) itemView.findViewById(R.id.text);
}
}
}
- Activity的布局文件
· <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
· xmlns:tools="http://schemas.android.com/tools"
· android:layout_width="match_parent"
· android:layout_height="match_parent" >
·
· <android.support.v7.widget.RecyclerView
· android:id="@+id/id_recyclerview"
· android:divider="#ffff0000"
· android:dividerHeight="10dp"
· android:layout_width="match_parent"
· android:layout_height="match_parent" />
·
· </RelativeLayout>
在Acitvity中的onCreate中引用代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mRecyclerView = findView(R.id.id_recyclerview);
//设置布局管理器
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//设置adapter
mRecyclerView.setAdapter(new AttachmentMaterAdapter(this,“数据集”));
}以上代码是实现初步的简单效果大致为(效果图借用洪洋大神的,希望不要介意哦!):
listview效果:
gridview效果:
瀑布流式效果:
为了实现更炫酷的效果,我们可加入可选操作:
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
这是系统为我们提供的一个默认的实现类,值得注意,这里更新数据集需要用 notifyItemInserted(position)
与notifyItemRemoved(position)
,而不是notifyDataSetChanged()
否则没有动画效果。
其中分割线的添加需要在代码中设置:
//添加分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.HORIZONTAL_LIST));
其中ItemDecoration需要我们自己去实现,重写该方法计算分割线。
在Recyclerview中如果我们需要添加点击事件或者长按事件需要我们自己在adapter中去添加代码如下(以点击事件为例):
public class AttachmentMaterAdapter extends RecyclerView.Adapter<AttachmentMaterAdapter.AttachmentMaterHolder>
implements OnClickListener{
private Context context;
private List<MaterialBean> materLists;
private OnRecyclerViewItemClickListener mOnItemClickListener = null;
public AttachmentMaterAdapter(Context context,List<MaterialBean> materLists) {
this.context = context;
this.materLists = materLists;
}
public static interface OnRecyclerViewItemClickListener {
void onItemClick(View view , MaterialBeanmaterDatas);
}
@Override
public AttachmentMaterHolderonCreateViewHolder(ViewGroup parent, int viewType) {
View view= LayoutInflater.from(context).inflate(R.layout.material_list_item,null);
AttachmentMaterHolder holder=new AttachmentMaterHolder(view);
view.setOnClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(AttachmentMaterHolderholder, int position) {
MaterialBean info=materLists.get(position);
holder.itemView.setTag(info);
if(info!=null){
holder.icon.setBackgroundResource(info.getIcon());
holder.textView.setText(info.getName());
}
}
@Override
public int getItemCount() {
return materLists.size();
}
public class AttachmentMaterHolder extends ViewHolder{
private ImageView icon;
private TextView textView;
public AttachmentMaterHolder(View itemView) {
super(itemView);
icon= (ImageView) itemView.findViewById(R.id.icon);
textView= (TextView) itemView.findViewById(R.id.text);
}
}
@Override
public void onClick(View v) {
if (mOnItemClickListener != null) {
//注意这里使用getTag方法获取数据
mOnItemClickListener.onItemClick(v,(MaterialBean)v.getTag());
}
}
public void setOnItemClickListener(OnRecyclerViewItemClickListenerlistener) {
this.mOnItemClickListener = listener;
}
}
Recyclerview就介绍到这里,值得注意的地方是它的插入和删除数据的时候刷新是先调用notifyItemChanged(position);再调用:notifyItemRangeChanged(position, itemCount);
希望能够帮助到你,有不正之处望指正,谢谢。