RecyclerView学习笔记

主要方法:
setLayoutManager:设置显示方式,有LinearLayoutManager(像ListView一样的纵向列表布局),有GridLayoutManager(网格布局),有StaggeredLayoutManager(瀑布流)
setItemAnimator:设置Item的增加删除动画,系统有提供默认的DefaultItemAnimator()
addItemDecoration:添加分割线。可自定义分割线类型。
使用步骤:
跟ListView类似的:画Item布局,添加RecycleView控件,复写Adapter。不同的是复写RecycleView.Adapter要复写ViewHolder的一些方法,RecyclerView要求必须使用ViewHolder。<ViewHolder的主要的作用,实际上是通过成员变量存储对应的convertView中需要操作的子View,避免每次findViewById,从而提升运行的效率。>
比如:在Adapter中新建内部类:MyViewHolder extends ViewHolder
在该类的构造函数中findViewByid来找到item布局中的控件,如:
class MyViewHolder extends RecyclerView.ViewHolder{
public MyViewHolder(View view){
  super(view);
  tv = (TextView) view.findViewById(R.id.id_num);
     }
}

复写onCreateViewHolder(),在这里来加载Item布局

@Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        MyViewHolder viewHolder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_layout,parent,false));
        return viewHolder;
    }

复写onBindViewHolder(),在这里为View填充数据,以及为Item添加点击事件等

@Override
public void onBindViewHolder(HomeAdapter.MyViewHolder holder, int position) {
  holder.tv.setText(mData.get(position));
}

Adapter基本写好,还可以加入一些addItem或者removeItem的方法。

接下来就是如何使用了:
一些常规代码,如:声明并find到RecyclerView,声明adapter,设置LayoutManager
// mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
// mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));
//        mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));

设置(添加、删除)动画

mRecyclerView.setItemAnimator(new DefaultItemAnimator());

设置适配器,Ok了

要添加分割线的话可以参考大神文章http://blog.csdn.net/lmj623565791/article/details/45059587,这个可以用,但是个人觉得这样还是太麻烦了,还不如直接在xml上margin做文章来设置空隙。

设置点击事件

添加接口:

public interface OnItemClickLitener{
        void onItemClick(View view, int position);
        void onItemLongClick(View view , int position);
}

添加设置点击事件的方法:

private OnItemClickLitener mOnItemClickLitener;

    public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)
    {
        this.mOnItemClickLitener = mOnItemClickLitener;
    }
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
            holder.textView.setText(mDatas.get(position).getTitle());

            if (mOnItemClickListener != null){
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        int pos = holder.getLayoutPosition();
                        mOnItemClickListener.onItemClick(view , pos);
                    }
                });

                holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View view) {
                        int pos = holder.getLayoutPosition();
                        mOnItemClickListener.onItemLongClick(view , pos);
                        return false;
                    }
                });
            }
        }

 

 注意,这里更新数据集不是用adapter.notifyDataSetChanged()而是 notifyItemInserted(position)与notifyItemRemoved(position),否则没有动画效果。

posted @ 2016-05-30 15:54  Steve_Nash  阅读(264)  评论(0编辑  收藏  举报