recyclerView简单解析

来源:互联网 发布:免费虚拟化软件 编辑:程序博客网 时间:2024/06/16 07:45

1.recyclerView相对listView的优点:

       a.使用更加灵活

       b.强制绑定了ViewHolder

2.recyclerView的设置思想:

      a.不关心内部的item是否显示在正确的位置,如何显示<-----LayoutManager(设置LinearLayoutManager,GridLayoutManager)
      b.不关心item间如何分隔<--------ItemDecoration(ListView可以通过Divider来设置)
      c.不关心item增加与删除的动画效果<------ItemAnimator(可实现其子类)
      d.仅仅关注如何回收与复用view

3.recyclerView的重要类:

    a.Layoutmanager

        该类决定recyclerView的布局模式:大致有如下几种模式:  

  •  LinearLayoutManager

  • GridLayoutManager

  • StaggeredGridLayoutManager

    b.ItemDecoration

         该类主要用来定义recyclerView的分隔线,recyclerView默认没有分隔线,需要程序员自己继承ItemDecoration类,实现自定义的样式

       下面是github上已实现分隔线的地址:

         https://github.com/dinuscxj/RecyclerItemDecoration

    c.ItemAnimator

          该类主要用来定义添加或删除recyclerView的条目时,所展现的动画效果,默认提供了DefaultItemAnimator的动画效果

          程序员可以自定义动画效果,下面是github上已实现动画的地址:

           https://github.com/gabrielemariotti/RecyclerViewItemAnimators

4.recyclerView具体实现(参考慕课网实例:http://www.imooc.com/video/8189)

     a.导入recyclerView,如下图所示:

     

             


      b.activity-main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:orientation="vertical"    android:layout_height="match_parent">    <android.support.v7.widget.Toolbar        android:id="@+id/toolbar"        android:layout_width="match_parent"        android:background="#d66666"        android:layout_height="60dp"/>    <android.support.v7.widget.RecyclerView        android:id="@+id/recyclerview"        android:layout_width="match_parent"        android:layout_height="match_parent" /></LinearLayout>

c.自定义分隔线:

     

/** * Created by yh on 2016/6/15. * 自定义分隔线 */public class SampleItemDecoration extends RecyclerView.ItemDecoration {    private Context mContext;    private static final int[] ATTRS = new int[]{android.R.attr.listDivider};    private Drawable mDivider;    public SampleItemDecoration(Context context) {        this.mContext = context;        TypedArray a = mContext.obtainStyledAttributes(ATTRS);        //获取分隔线对象        mDivider = a.getDrawable(0);        a.recycle();    }    @Override    public void onDraw(Canvas c, RecyclerView parent) {        //分隔线的左坐标        int left = parent.getPaddingLeft();        //分隔线的右坐标        int right = parent.getWidth() - parent.getPaddingRight();        /**         * 获取子view的个数         */        int childCount = parent.getChildCount();        if (childCount > 0) {            for (int i = 0; i < parent.getChildCount(); i++) {                final View childView = parent.getChildAt(i);                RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) childView.getLayoutParams();                //分隔线的上顶点                int top = childView.getBottom() + params.bottomMargin;                //分隔线的下顶点                int buttom = top + mDivider.getIntrinsicHeight();                //设置分隔线的画线的范围                mDivider.setBounds(left, top, right, buttom);                mDivider.draw(c);            }        }        super.onDraw(c, parent);    }}


d.给recyclerView添加分隔线:

   

DividerItemDecoration itemDecoration = new DividerItemDecoration(getApplicationContext(), DividerItemDecoration.VERTICAL_LIST);        mRecyclerView.addItemDecoration(itemDecoration);

e.给recyclerView添加动画效果:

   

        mRecyclerView.setItemAnimator(new DefaultItemAnimator());

f.定义adapter:

 

public class SimpleAdapter extends RecyclerView.Adapter<SimpleViewHolder> {    private Context mContext;    private List<String> mDatas;    private LayoutInflater mInflater;    public SimpleAdapter(Context context, List<String> datas) {        mContext = context;        mDatas = datas;        mInflater = LayoutInflater.from(context);    }    @Override    public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        View view = mInflater.inflate(R.layout.simple_textview, parent, false);        SimpleViewHolder viewHolder = new SimpleViewHolder(view);        return viewHolder;    }    @Override    public void onBindViewHolder(final SimpleViewHolder holder, final int position) {        holder.mTextView.setText(mDatas.get(position));        holder.mTextView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (mOnclickListener!=null){                    int position=holder.getLayoutPosition();                    mOnclickListener.onClick(position);                }            }        });    }    @Override    public int getItemCount() {        return mDatas.size();    }    /**     * 添加条目     *     * @param position     */    public void addItem(int position) {        mDatas.add(position,"inserted one");        notifyItemInserted(position);    }    /**     * 删除条目     * @param position     */    public void deleteItem(int position) {        mDatas.remove(position);        notifyItemRemoved(position);    }    private OnClickListener mOnclickListener;    public void setOnclickListener(OnClickListener onclickListener){        this.mOnclickListener=onclickListener;    }    public interface OnClickListener{        void onClick(int position);    }}

   注意adapter必须继承RecyclerView.Adapter

            ViewHolder必须继承RecyclerView.ViewHolder

        删除和添加条目时,调用的是

                  notifyItemInserted(position);

                  notifyItemRemoved(position);

   g.给recyclerView添加点击事件:

      由于RecyclerView没有提供点击和长按的监听事件,则需要自己在自定义adapter中使用接口回调的方式添加相应的监听器,具体步骤:
         1.申明一个接口,里面提供相应的方法。
         2.定义一个类级别的接口对象。
         3.定义一个set方法用于外部传递接口变量。
        4.在onBindView方法中调用。


h.在外部调用set方法实现点击事件:

     

       /**         * 给recyclerView设置点击事件         */        mAdapter.setOnclickListener(new SimpleAdapter.OnClickListener() {            @Override            public void onClick(int position) {                Toast.makeText(MainActivity.this,position+"", Toast.LENGTH_SHORT).show();            }        });



 i:源码地址:

   https://github.com/yaoyoucai/RecycleView/tree/87ac001ad3a9ae3f823cce8494c7bcba0f82edbf














re
0 0
原创粉丝点击