recyclerView简单解析

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值