RecycleView及RecycleView Adapter

BB:虽然这个出来很久了,但是很惭愧还没有在真正的项目中使用到。不过话说过来android N都出来了,大部分android手机系统还是4.x,在此只能呵呵。顺便说一句这是我第一篇博客,希望各位看官不喜勿喷,如果是好的意见我欣然接受,好了bb完了。

  1. recycleview的初步使用
  2. recycleview.adapter的认识
  3. 打造通用recycleview adapter(暂时不加)

引入 recycleview

首先我们要gradle的依赖库中添加 compile ‘com.android.support:recyclerview-v7:21.+’ 。如果是eclipse直接导入android-support-v7-recyclerview.jar就可以了。

recycleview初步使用

基本上就是这四个步骤
/**
* 设置Adapter
*/
mRecyclerView.setAdapter(mListAdapter);
/**
* 设置布局管理器
*/
mRecyclerView.setLayoutManager(linearLayoutManager);
/**
* 设置item分割线
*/
mRecyclerView.addItemDecoration(itemDecoration);
/**
* 设置item动画
*/
mRecyclerView.setItemAnimator(new DefaultItemAnimator());

android为我们提供了3种LayoutManager
LinearLayoutManager:线性布局,横向或者纵向滑动列表
GridLayoutManager:表格布局
StaggeredGridLayoutManager:流式布局,例如瀑布流效果
还可以继承RecyclerView.LayoutManager来实现一个自定义的LayoutManager。
我们当然也可以通过RecyclerView.ItemAnimator类定制动画,然后通过RecyclerView.setItemAnimator()方法来进行使用。

recycleview adapter的使用

其实recycleview的adapter其实也和我们平常的adapter也差不多,在我看来最大的不同就是它封装了一个viewholder。接下来描述下一下简单的recycleview adapter 要如何写吧。
* 编写一个adapter继承RecyclerView.Adapter

public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ItemViewHolder>{

    private Context mContext;
    private List<String> mDatas = null;
    private LayoutInflater mInflater;
    //点击事件接口
    private OnItemClickListener mClickListener = null;
    /** * 初始化数据 * @param context * @param Datas */
    public ListAdapter(Context context,List<String> Datas) {
        mContext = context;
        mDatas = mDatas;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ItemViewHolder viewHolder = new ItemViewHolder(mInflater.inflate(R.layout.support_simple_spinner_dropdown_item,null));
        return viewHolder;
    }

    /** * 绑定数据set data * @param holder * @param position */
    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
    @Override
    public void onBindViewHolder(ItemViewHolder holder, final int position) {
        holder.mTextView.setText("");
        if(mClickListener != null){
            /** * 这里加了判断,itemViewHolder.itemView.hasOnClickListeners() * 目的是减少对象的创建,如果已经为view设置了click监听事件,就不用重复设置了 * 不然每次调用onBindViewHolder方法,都会创建两个监听事件对象,增加了内存的开销 */
        if(!holder.itemView.hasOnClickListeners()){
            holder.itemView.setOnClickListener(new View.OnClickListener(){

                @Override
                public void onClick(View v) {
                    mClickListener.OnItemClick(v,position);
                }
            });
        }
        }

    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }






    /** * recyvlerView的viewholder */
    class ItemViewHolder extends RecyclerView.ViewHolder{

        private TextView mTextView;

        public ItemViewHolder(View itemView) {
            super(itemView);
            //初始化控件,find id
// mTextView = itemView.findViewById(R.id.)
        }
    }

    interface OnItemClickListener{
        public void OnItemClick(View view,int position);
        public void OnItemLongClick(View view,int position);
    }
}

补充一下:至于分割线和动画等这里我先不做分析。可以参考这里写链接内容

Base RecycleView Adapter

public abstract class BaseAdapter extends RecyclerView.Adapter<BaseViewHolder> {


    private OnItemClickListener onItemClickListener;

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new BaseViewHolder(LayoutInflater.from(parent.getContext()).inflate(viewType, parent, false));
    }

    @Override
    public void onBindViewHolder(final BaseViewHolder holder, final int position) {


        if (onItemClickListener != null) {
            holder.getmConvertView().setClickable(true);
            holder.getmConvertView().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onItemClickListener.onItemClick(holder.getAdapterPosition());
                }
            });
        }
        onBindView(holder, holder.getAdapterPosition());

    }

    protected abstract void onBindView(BaseViewHolder holder, int position);

    @Override
    public int getItemViewType(int position) {
        return getLayoutID(position);
    }


    protected abstract int getLayoutID(int position);


    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }


}

你可能感兴趣的:(android)