recyclerview的使用

一、recyclerview简介:
RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用户只要实现自己的viewholder就可以了,该组件会自动帮你回收复用每一个item
它不但变得更精简,也变得更加容易使用,而且更容易组合设计出自己需要的滑动布局。

api文档中对recyclerview的介绍:
RecyclerView  is a more advanced and flexible version of  ListView . This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the  RecyclerView  widget when you have lists with elements that change dynamically.
简单说,它是ListView的进化,为了当你需要动态展示一组数据的时候就会需要它。

recyclerview相比listview的优点:
  1. 简介中提到的它封装了viewholder的回收复用。
  2. RecyclerView使用布局管理器管理子view的位置,也就是说你再不用拘泥于ListView的线性展示方式,能够使用复杂的布局来展示一个动态组件。
  3. 自带了ItemAnimation,可以设置加载和移除时的动画,方便做出各种动态浏览的效果

二、recyclerview可以实现的效果
  技术分享




三、使用recyclerview的前期准备
RecyclerView 是 android-support-v7-21 版本中新增的一个 Widgets,除了需要导入v7包之外,还需要导入recyclerview的jar包
gradle里加入:
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:recyclerview-v7:23.1.1'

四、recyclerview的基本使用
基本的使用分为3个步骤

1.创建布局管理器,为recylerview设置布局管理器:调用Recylerview的 setLayoutManager方法
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
//可以设置方向
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView.setLayoutManager(linearLayoutManager);

2.初始化要展示的数据集合
List<String> listData = new ArrayList<String>();
for (int i = 0; i < 100; i++) {
listData.add(String.valueOf(i));
}


3.创建adapter,并为recylerview设置adapter,在adapter里定义并设置view holder
首先定义一个adapter类
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {

List<String> mListDatas;
Context mContext;

MyAdapter(List<String> listDatas,Context context){
mListDatas = listDatas;
this.mContext = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ViewHolder holder = null;//new ViewHolder()

View itemView = LayoutInflater.from(mContext).inflate(android.R.layout.simple_list_item_1,null);
holder = new ViewHolder(itemView);

return holder;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mTextView.setText(mListDatas.get(position));

}

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

public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;

public ViewHolder(View itemView) {
super(itemView);

mTextView = (TextView) itemView;
}
}
}

然后设置recylerview的adapter
recyclerView.setAdapter(new MyAdapter(listData,this));

五、recyclerview的其他功能点:

1.  LayoutManager除了上面的LinearLayoutManger之外,还可以是以下两种:
  1. GridLayoutManager:网状布局的recylerview,比较简单,作为练习题
  2. StaggeredGridLayoutManager:交错排列的grid,可以用于实现瀑布流效果
  • 2.设置item之间的间距:
  • RecyclerView.ItemDecoration:
  • An ItemDecoration allows the application to add a special drawing and layout offset
    * to specific item views from the adapter's data set. This can be useful for drawing dividers
    * between items, highlights, visual grouping boundaries and more.

3.item点击事件的响应
recyclerview并没有方法直接响应item的点击,但是可以在adapter里的 ViewHolder里面是可以获取到每个item的根viewF的,而且viewholder里面有 getLayoutPosition能获取当前点击的位置
所以可以在viewholder里对根view设置点击事件的响应
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener{
ImageView mIvData;
View mItemView;
public MyViewHolder(View itemView) {
super(itemView);
mItemView = itemView;
itemView.setOnLongClickListener(this);



mIvData = (ImageView) itemView.findViewById(R.id.ivItem);
}

@Override
public boolean onLongClick(View v) {
int lPos = getLayoutPosition();
removeData(lPos);

return false;
}
}
4.在recyclerview中删除一个item:
先删除adapter里list中对应位置的数据,然后调用notify方法,注意notify要指定删除数据的位置
public void removeData(int position) {
mListDatas.remove(position);
notifyItemRemoved(position);
}



使用以上几个知识点,结合前面讲的内容,我们看以下瀑布流的效果怎么用recylerview实现,然后再瀑布流里实现长按删除某个item数据的功能
跟前面的例子不一样的两个地方:
1.设置layoutmanager
//设置layoutmanager
StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(staggeredGridLayoutManager);
2.设置间距,首先需要定义一个类继承ItemDecoration
public class SpaceItemDecoration extends RecyclerView.ItemDecoration{
private int miSpace;
public SpaceItemDecoration(int iSpace)
{
miSpace = iSpace;
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
outRect.bottom = miSpace;
outRect.left = miSpace;
outRect.right = miSpace;
if(parent.getChildItemId(view) == 0){
outRect.top = miSpace;
}
}
}

然后通过这个类的对象设置间距
//设置间距
SpaceItemDecoration space = new SpaceItemDecoration(12);
recyclerView.addItemDecoration(space);

3.长按删除就是用前面功能点介绍第3、4两点的代码即可
相关文章
相关标签/搜索