RecyclerView研究

前言

android常用组件中ListView是我们手中的常客 , 几乎没有一个APP不使用这个组件的 , 我们为他添加下拉刷新 , 为他添加上拉加载 , 为他的每个Item写动画效果 , 几乎一个APP的很多工作 , 都耗费在了ListView上面 。每次写Adapter几乎都要为其手动实现一个ViewHolder,即使自己封装了ViewHolder ,但灵活性也就缺失了 , 如果将列表转换成gridView对与listView就会很麻烦 , 但是对于RecyclerView确实轻而易举 , 不管是竖直还是水平 ,他都能友好的完成任务 , 简直是我们android程序员的好伙伴 , 你一定要学会他 。

RecyclerView是个容器类 , google也给我们提供了一个兼容类 ,在V7包中 , 路径如下图:

如果是IDE是eclipse的话, 找到这个包 , 将其拷贝到Lib下 , 就可以使用了 , 下面我们看看布局怎么用 :
<android.support.v7.widget.RecyclerView
        android:background="#33ddee"
        android:id="@+id/rvBasicRecyclerView"
        android:scrollbars="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
用法很简单 ,和普通控件一样, 最为关键的是 , 编写我们的Adapter 类。 我们需要编写一个Adapter类来继承至RecyclerView.Adapter ,实现onCrateViewHolderonBindViewHolder两个方法 。一个用于创建单个Item视图对象 , 相当于ListView中的getView()方法,提供一个Item的视图对象 。一个是将我们Item中的组件与数据相关连 。下面我们看用法 :
package com.zhuyongit.recyclerviewdemo.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.zhuyongit.recyclerviewdemo.R;
import com.zhuyongit.recyclerviewdemo.bean.NewsBean;
import java.util.List;
/**
 * @author  zeno
 *
 * @email   [email protected]
 *
 * @website http://www.zhuyongit.com
 *
 * @version 1.0
 *
 * RecyclerView基本使用 ,类似ListView控件 , 列表显示
 */
public class BasicRecyclerAdapter extends RecyclerView.Adapter{
    private static final String TAG = "BasicRecyclerAdapter" ;
    private List<NewsBean> mDatas ;
    private OnLongClickListener     mOnLongClickListener ;
    public BasicRecyclerAdapter(List<NewsBean> datas) {
        this.mDatas = datas;
    }
    /**
     * 创建一个ViewHolder 复用控件对象
     */
    public class ViewHolder extends RecyclerView.ViewHolder {
        private TextView tvTitle ;
        private TextView tvContent ;
        public ViewHolder(View rootView) {
            super(rootView);
            tvTitle = (TextView) rootView.findViewById(R.id.tvTitle);
            tvContent = (TextView) rootView.findViewById(R.id.tvContent);
            /**
             * 设置RecyclerView 单个Item对象长按事件
             */
            rootView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    mOnLongClickListener.onLongCick(v, getLayoutPosition());
                    return false;
                }
            });
        }
        public TextView getTvTitle() {
            return tvTitle;
        }
        public TextView getTvContent() {
            return tvContent;
        }
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // 返回单个Item的View对象
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.basic_recycler_item_layout,parent,false) ;
        return new ViewHolder(view);
    }
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        // 将数据绑定到控件上
        ViewHolder _viewHolder = (ViewHolder) holder;
        NewsBean  _newsBean = (NewsBean) mDatas.get(position);
        _viewHolder.getTvTitle().setText(_newsBean.getTitle());
        _viewHolder.getTvContent().setText(_newsBean.getContent());
    }
    @Override
      public int getItemCount() {
        return mDatas.size();
    }
    /**
     * 向RecyclerView添加单个Item
     * @param position
     */
    public void addItem(int position) {
        mDatas.add(position, new NewsBean("落花虽有意", "奈何流水却无情"));
        // 插入Item的时候刷新单个Item
        notifyItemInserted(position);
    }
    /**
     * 删除ReclcerView单个Item
     * @param position
     */
    public void deleteItem(int position) {
        mDatas.remove(position) ;
        // 移除Item的时候刷新单个Item
        notifyItemRemoved(position);
    }
    /**
     * 设置单个Item的长按事件
     * @param listener
     */
    public void setOnLongClickListener(OnLongClickListener listener) {
            this.mOnLongClickListener = listener ;
    }
    /**
     * 定义个长按事件接口 , 用于向外部提供长按事件处理接口
     */
    public interface OnLongClickListener {
        public void onLongCick(View view , int position) ;
    }
}

因为RecyclerView容器的特性 , 所以google连Item之间的divider线也不给我们提供 , 需要我们自己去实现 ,addItemDecoration()方法可以指定Item之间的divider , 实现Item divider 的效果有很多方法 ,我这边直接指定的margin设置的 , 各位看官可根据自己的喜好 , 自行设置 。RecyclerView还有一个比较好的方法就是setItemAnimator(new DefaultItemAnimator()) , 可以自定义Item的动画效果 , 这里实现了一个系统默认的动画效果 。

效果图 :


你可能感兴趣的:(android)