Android RecyclerView

来源:互联网 发布:外卖送餐员用什么软件 编辑:程序博客网 时间:2024/06/05 04:24

参考网址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@Overridepublic 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实现点击事件

@Overridepublic void onItemClick(View view, int position) {    Toast.makeText(getActivity(), position+"", Toast.LENGTH_SHORT).show();}

参考网址http://blog.csdn.net/guxiao1201/article/details/40423361

0 0