recyclerview使用详解

recycler是5.0之后退出的替代listview和gridview的解决方案,可以通过导入support的V7包

0.功能

1layoutmanager布局管理器,设置显示方式

2ItemDecoration 设置item间的间隔

3ItemAnimator控制item增删的的动画

4.(缺点)在adapter设置点击、长按事件ItemClickListenerItemLongClickListener


1.在activity里面的配置

mRecyclerView = findView(R.id.id_recyclerview);

//设置布局管理器

mRecyclerView.setLayoutManager(layout);

//设置adapter

mRecyclerView.setAdapter(adapter)

//设置Item增加、移除动画

mRecyclerView.setItemAnimator(new DefaultItemAnimator());

//添加分割线

mRecyclerView.addItemDecoration(new DividerItemDecoration(   getActivity(), DividerItemDecoration.HORIZONTAL_LIST));

2.adapter需要重写的方法

getItemCount 这个不用说,获取总的条目数

onCreateViewHolder 创建ViewHolder、创建setlistener的监听

onBindViewHolder 将数据绑定至ViewHolder

1.刷新--holder.updatePosition(position);

2.定义视图与数据的绑定convert(holder, mDatas.get(position));
 
  

3详细说明

3.1布局管理器

LinearLayoutManager 现行管理器,支持横向、纵向。

GridLayoutManager 网格布局管理器

StaggeredGridLayoutManager 瀑布就式布局管理器

//mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

  mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));

mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,        StaggeredGridLayoutManager.VERTICAL)); --可以横竖的,看你要哪个在后一个变量改

3.2关于画分割线

onDraw

--drawchildren

onDrawOver

getItemOffsets 可以通过outRect.set()为每个Item设置一定的偏移量,主要用于绘制Decorator。 

3.3动画设置

// 设置item动画

mRecyclerView.setItemAnimator(new DefaultItemAnimator());

更新数据集不是用adapter.notifyDataSetChanged()而是

notifyItemInserted(position)

notifyItemRemoved(position)

public void addData(int position) {

        mDatas.add(position, "Insert One");

        notifyItemInserted(position);

    }

    public void removeData(int position) {

            mDatas.remove(position);

        notifyItemRemoved(position);

}

4.点击事件的处理

//...

    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, final int position)

    {

        holder.tv.setText(mDatas.get(position));

 

        // 如果设置了回调,则设置点击事件

        if (mOnItemClickLitener != null)

        {

            holder.itemView.setOnClickListener(new OnClickListener()

            {

                @Override

                public void onClick(View v)

                {

                    int pos = holder.getLayoutPosition();

                    mOnItemClickLitener.onItemClick(holder.itemView, pos);

                }

            });

 

            holder.itemView.setOnLongClickListener(new OnLongClickListener()

            {

                @Override

                public boolean onLongClick(View v)

                {

                    int pos = holder.getLayoutPosition();

                    mOnItemClickLitener.onItemLongClick(holder.itemView, pos);

                    return false;

                }

            });

        }

    }

//...

 

关于activity的监听需要设置在activity里面

 

   mAdapter.setOnItemClickLitener(new OnItemClickLitener()

        {

 

            @Override

            public void onItemClick(View view, int position)

            {

                Toast.makeText(HomeActivity.this, position + " click",

                        Toast.LENGTH_SHORT).show();

            }

 

            @Override

            public void onItemLongClick(View view, int position)

            {

                Toast.makeText(HomeActivity.this, position + " long click",

                        Toast.LENGTH_SHORT).show();

                        mAdapter.removeData(position);

            }

        });

viewholder里实现的方法

get--获取viewholder

getview--通过viewid获取控件

getcontentview--获取重写的视图

viewhodler的set子视图系列。。。

设置时间点击时间---setOnClickListener等系列

可选系列:

updateposition---数据绑定onBindViewHolder方法至viewHolder的时候及时刷新

getLayoutId--通过获取布局id,来变更item视图

附加

在定义不同布局时候的解决方法

常见以下几类:

简单的数据绑定(单种Item

多种Item Type 数据绑定

增加onItemClickListener , onItenLongClickListener

优雅的添加分类header 

那么解决方案是:

设置一个多类型布局的支持接口,并定义重写布局和其中id的方法

public interface MultiItemTypeSupport<T>
{
   int getLayoutId(int itemType);
   int getItemViewType(int position, T t);
}

重写适配器2个方法

getItemViewType
onCreateViewHolder

getLayoutId(需要在构造方法super里面实现)
convert



你可能感兴趣的:(UI控件)