recycler是5.0之后退出的替代listview和gridview的解决方案,可以通过导入support的V7包
0.功能
1layoutmanager布局管理器,设置显示方式
2ItemDecoration 设置item间的间隔
3ItemAnimator控制item增删的的动画
4.(缺点)在adapter设置点击、长按事件ItemClickListener与ItemLongClickListener
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