在这里简单实现一下RecyclerView如果各位还想更深入的了解一些RecyclerView相关的内容那本篇文章只适合初识RecyclerView的朋友
RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
- 你想要控制其显示的方式,请通过布局管理器LayoutManager
- 你想要控制Item间的间隔(可绘制),请通过ItemDecoration
- 你想要控制Item增删的动画,请通过ItemAnimator
- 你想要控制点击、长按事件,请自己写
RecyclerView的这个名字了,从它类名上看,RecyclerView代表的意义是,我只管Recycler View,也就是说RecyclerView只管回收与复用View,其他的你可以自己去设置。可以看出其高度的解耦,给予你充分的定制自由(所以你才可以轻松的通过这个控件实现ListView,GirdView,瀑布流等效果)。
RecyclerView的使用代码
首先要添加依赖
compile'cn.lemon:RefreshRecyclerView:1.2.0'
mRecyclerView = findView(R.id.id_recyclerview);//设置布局管理器mRecyclerView.setLayoutManager(layout);//设置adaptermRecyclerView.setAdapter(adapter)//设置Item增加、移除动画mRecyclerView.setItemAnimator(new DefaultItemAnimator());//添加分割线mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.HORIZONTAL_LIST));
第一步
因为我们RecyclerView的每一条item都是一个viewholder所以我们要先定义一个viewholder类MyViewHolder
需要在这里找到控件做多条目的时候所有的控件id都要找到
public class MyViewHolderextends RecyclerView.ViewHolder {
public TextView text,text1;
public ImageView img;
public MyViewHolder(View itemView) {
super(itemView);
text= (TextView) itemView.findViewById(R.id.text);
text1= (TextView) itemView.findViewById(R.id.text1);
img= (ImageView) itemView.findViewById(R.id.img);
}
}
第二步
我们需要写一个适配器的类
MyAdapter我们都知道在使用listview的时候写的适配器需要继承BaseAdapter但是我们使用
RecyclerView的时候需要继承他们封装好的一个类
RecyclerView.Adapter<MyViewHolder>我们看到这里需要一个泛型,泛型这里是你自定义的viewholder类
上面也说了RecyclerView没有提供点击方法所以我们需要自定义一个下面在代码里写的很清楚
创建一个接口
public class MyAdapterextends RecyclerView.Adapter<MyViewHolder>{
private Context context;
private List<String>list=new ArrayList<>();
public MyAdapter(Context context) {
this.context= context;
for(inti=0;i<10;i++){
list.add("姚翔-->"+i);
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=null;
switch(viewType){
case0:
view=View.inflate(context,R.layout.irem,null);
break;
case1:
view=View.inflate(context,R.layout.item,null);
break;
default:
break;
}
final MyViewHolder holder=new MyViewHolder(view);
if(listner!=null){
view.setOnClickListener(newView.OnClickListener() {
@Override
public void onClick(View view) {
//holder.getLayoutPosition()获取点击的条目位置;
listner.onItemClick(view,holder.getLayoutPosition());
}
});
view.setOnLongClickListener(newView.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
listner.onLongItemClick(view,holder.getLayoutPosition());
//防止与click事件冲突
return true;
}
});
}
return holder;
}
//赋值数据
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
inttype = getItemViewType(position);
switch(type){
case0:
holder.text.setText(list.get(position));
break;
case1:
holder.text1.setText(list.get(position));
break;
default:
break;
}
}
@Override
public int getItemCount() {
returnlist.size();
}
//点击事件;
privat eOnClickRecyclerListner listner;
//设置点击事件;
public void setLisner(OnClickRecyclerListner lisner){
this.listner=lisner;
}
//设置多条目
@Override
public int getItemViewType(intposition) {
if(position%2==0){
return1;
}
return0;
}
//创建一个接口的内部类 或者直接在外面创建也是可以的
public interface OnClickRecyclerListner {
//点击事件
void onItemClick(View view, int position);
//长安点击事件,也可以在写触摸事件
void onLongItemClick(View view,intposition);
}
}
第三部
在main方法里对RecyclerView进行绑定适配器了
找控件在这就不多说了
先绑定RecyclerView的布局结构
recyclerview.setLayoutManager(在这里方布局管理器);
布局管理器基本有三大类
//线性布局
LinearLayoutManager manager = new LinearLayoutManager(this);
//网格布局
GridLayoutManager glide = new GridLayoutManager(this, 3);
//瀑布流布局
StaggeredGridLayoutManager stage = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
然后绑定我们上面写好的适配器的类
这时候可以需要
//添加分割线,DividerItemDecoration.VERTICAL=纵向显示数据时添加的分割线;
recyclerview.addItemDecoration(newDividerItemDecoration(this,DividerItemDecoration.VERTICAL));
recyclerview.addItemDecoration(newDividerItemDecoration(this,DividerItemDecoration.HORIZONTAL));
如果这时候需要点击事件的话就可以用得到上面我们定义的那个接口了
只需要用adapter适配器调用我们对应的实例点击事件的接口的方法就可以了
adapter.setLisner(newMyAdapter.OnClickRecyclerListner1() {
@Override
public void onItemClick(View view, intposition) {
Toast.makeText(MainActivity.this,position+"",Toast.LENGTH_LONG).show();
}
@Override
public void onLongItemClick(View view, intposition) {
Toast.makeText(MainActivity.this,position+" 长摁",Toast.LENGTH_SHORT).show();
}
});