参考网址http://blog.csdn.net/skykingf/article/details/50827141
①RecylerView封装了viewholder的回收复用,也就是说RecylerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的 逻辑被封装了,写起来更加简单。
②提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecylerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还有StaggeredGridLayoutManager等),也就是说RecylerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。你想控制Item的分隔线,可以通过继承RecylerView的ItemDecoration这个类,然后针对自己的业务需求去抒写代码。
③可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecylerView有其自己默认的实现。
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(this );
//设置布局管理器
recyclerView.setLayoutManager(layoutManager);
//设置为垂直布局,这也是默认的
layoutManager.setOrientation(OrientationHelper. VERTICAL);
//设置Adapter
//recyclerView.setAdapter( recycleAdapter);
//适配器
recyclerView.setAdapter(new MyRecyclerAdapter(this, mDatas));
//设置分隔线
recyclerView.addItemDecoration( new DividerGridItemDecoration(this ));
//设置增加或删除条目的动画
recyclerView.setItemAnimator( new DefaultItemAnimator());
RecyclerView.Adapter,需要实现3个方法:
①onCreateViewHolder()
这个方法主要生成为每个Item inflater出一个View,但是该方法返回的是一个ViewHolder。该方法把View直接封装在ViewHolder中,然后我们面向的是ViewHolder这个实例,当然这个ViewHolder需要我们自己去编写。直接省去了当初的convertView.setTag(holder)和convertView.getTag()这些繁琐的步骤。
②onBindViewHolder()
这个方法主要用于适配渲染数据到View中。方法提供给你了一个viewHolder,而不是原来的convertView。
③getItemCount()
这个方法就类似于BaseAdapter的getCount方法了,即总共有多少个条目。
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> {
private List<String> mDatas;
private Context mContext;
private LayoutInflater inflater;
public MyRecyclerAdapter(Context context, List<String> datas){
this. mContext=context;
this. mDatas=datas;
inflater=LayoutInflater. from(mContext);
}
@Override
public int getItemCount() {
return mDatas.size();
}
//填充onCreateViewHolder方法返回的holder中的控件
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
holder.tv.setText( mDatas.get(position));
}
//重写onCreateViewHolder方法,返回一个自定义的ViewHolder
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.item_home,parent, false);
MyViewHolder holder= new MyViewHolder(view);
return holder;
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView tv;
public MyViewHolder(View view) {
super(view);
tv=(TextView) view.findViewById(R.id.tv_item);
}
}
}
recycleView布局
①LinearLayoutManager即线性布局,这个是在上面的例子中我们用到的布局
②GridLayoutManager即表格布局
mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));
③StaggeredGridLayoutManager即流式布局,如瀑布流效果
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.HORIZONTAL));
mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4, SggeredGridLayoutManager.VERTICAL));
参考网址http://blog.csdn.net/skykingf/article/details/50827141
点击事件实现
1,点击事件接口
public interface OnItemClickListener{
void onItemClick(View view, int position);
}
2,MyViewHolder实现接口
class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView tv;
OnItemClickListener onItemClickListener;
public MyViewHolder(View view, OnItemClickListener onItemClickListener) {
super(view);
this.onItemClickListener = onItemClickListener;
tv=(TextView) view.findViewById(R.id.tv_item);
view.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (onItemClickListener!=null) {
onItemClickListener.onItemClick(v, getAdapterPosition());
}
}
}
3,MyRecyclerAdapter传入onItemClickListener给MyViewHolder
//重写onCreateViewHolder方法,返回一个自定义的ViewHolder
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.item_home,parent, false);
MyViewHolder holder= new MyViewHolder(view, mOnItemClickListener);
return holder;
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener ){
this. mOnItemClickListener=onItemClickListener;
}
4, Activity实现点击事件
@Override
public void onItemClick(View view, int position) {
Toast.makeText(getActivity(), position+"", Toast.LENGTH_SHORT).show();
}
参考网址http://blog.csdn.net/guxiao1201/article/details/40423361