RecyclerView是谷歌新推出的一个控件,关注于控件的回收与复用
可以实现的效果:可以实现Listview,gridview,也可以实现横向的listview和gridview,瀑布流。
与其相关的5大主要类:adapter,ViewHolder,LayoutManger(用于风格和位置),ItemDecoration(用于间隔),ItemAnimator(用于内容的删除,增加的动画)。
话不多说,直接说下大概用法吧。
Adapter,ViewHolder的用法:
首先是RecyclerView用成listview的用法。首先先在布局声明一个RecyclerView。然后创建一个继承RecyclerView.Adapter的类,这就是RecyclerView适配器的不同之处.代码和解释如下:
class HomeAdapter extends RecyclerView.Adapter<MyViewHolder>//注意此处的自定义ViewHolder类,该类继承于ViewHolder,如下面代码所示(这就是Google强制我们用ViewHolder的原因)
{
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)//该方法用来加载子Item
{
View view=LayoutInflater.from( Content).inflate(R.layout.item_list, parent,false);//这是我们平常用来加载布局的操作
MyViewHolder holder=new MyViewHolder(view);//这个构造方法传入view,是必须的
return holder;//返回我们自定义的Viewholder
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position)//这个方法是用来进行填充内容,时间点击,于控件绑定的操作
{
//例如设置文本等holder.tv.setText();
}
@Override
public int getItemCount()//这个不用多说吧,就是个数量
{
//例如return mDatas.size();
}
class MyViewHolder extends ViewHolder//这个就是继承ViewHolder,里面的成员是你布局用有控件的成员
{
TextView tv;
public MyViewHolder(View view)
{
super(view);
tv = (TextView)view.findViewById(R.id.id_num);//赋值给成员
}
}
}
对于adapter和ViewHolder的用法就大概如此
LayoutManger的用法:
RecyclerView提供了
mRecyclerView.setLayoutManager(layoutmanger);//这里传入一个LayoutManger
所以我们可以通过传入不同的Layoutmanger子类进行RecyclerView的排版:
1.LinearLayoutManager 现行管理器,支持横向、纵向,例如
LinearLayoutManager ln=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);//第2个参数是属性,表示是垂直布局
2.GridLayoutManager 网格布局管理器,例如
GridLayoutManager grid=new GridLayoutManager(this,3)//第2个参数表示一行要多少个
3.StaggeredGridLayoutManager 瀑布就式布局管理器和横向的listv,例如:
StaggeredGridLayoutManager stagg=newStaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL);//通过设置属性,可实现横向的listview等
ItemAnimator的用法
可通过方法,设置添加和删除的动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());//这是谷歌给我们提供的动画
我们也可以通过自己制作,或者在git上查找一些动画
https://github.com/gabrielemariotti/RecyclerViewItemAnimators
最后,补充下特别要注意的3点:
1、进行查补动画时,应该调用notifyItemInserted(position)与notifyItemRemoved(position),而不是notifyDataSetChanged()
2.由于RecyclerView没有item点击事件,所以也只能自定义接口进行实现
3.由于用notifyItemInserted(position),notifyItemRemoved(position)方法,只是在原来插入,并没有刷新位置,所以会出现插入多少个,都是同样的postison,所以在item点击事件获取位置中,应该运用getLayoutPosition()获取item当前位置。