1、简介:可以把它看作是ListView、GridView等的包装产品,可以轻松实现上述俩的功能,并能用简单的code完成复杂的需求:数据加载+item间隔样式+item的增减动画+click事件(click+longclick)
2、使用RecyclerView时如果项目报错:
(1)检查ExternalLibraries下是否有RecyclerView相关信息,若没有检查SDKManageer下是否有更新
(2)在app-build.gradle中添加:compile 'com.android.support:recyclerview-v7:25.3.1'
3、操作RecyclerView的代码:
recyclerView = findView(R.id.id_recyclerview);mRecyclerView.setLayoutManager(layout);
a、LinearLayoutManager:线性布局,横向或者纵向滑动列表
b、GridLayoutManager:表格布局
c、StaggeredGridLayoutManager:流式布局,例如瀑布流效果
//设置adapter
recyclerView.setAdapter(adapter)
//设置Item增加、移除动画
recyclerView.setItemAnimator(newDefaultItemAnimator());
//添加分割线
recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(),DividerItemDecoration.HORIZONTAL_LIST));
4、ItemDecoration:
首先要弄清楚几个名词含义,itemview、divider
方法的执行顺序
getItemOffsets(通过outRect.set(l,t,r,b)设置指定itemview的paddingLeft,paddingTop,paddingRight,paddingBottom)
->onDraw(在绘制itemview之前绘制divider)
4、具体使用详见大神文章:
(Android RecyclerView 使用完全解析 体验艺术般的控件)http://blog.csdn.net/lmj623565791/article/details/45059587
上述文章在使用StaggeredGridLayoutManager ItemDecoration有两个问题:
(1)设置item间隔时最后一列右边是不需要间隔的,但是会造成最后一列和其他列的宽度不一致,可以将getItemOffsets方法中的所有mDivider.getIntrinsicWidth()替换为如下right:
int column=itemPosition%spanCount;
int right=mDivider.getIntrinsicWidth()-(column+1)*mDivider.getIntrinsicWidth()/spanCount;
PS:关于ItemDecoration的详细理解参加参见:
https://blog.piasy.com/2016/03/26/Insight-Android-RecyclerView-ItemDecoration/#fn:space-needed
(2)如果数据总数num%列数col==0,底部的divider也是不需要显示的,在isLastRow方法中修改如下:
childCount = childCount - (childCount % spanCount==0?spanCount:childCount % spanCount);
项目下载地址:https://github.com/jacksonrickq1/RecyclerViewDemo
PS(上传代码到git参考:http://www.jianshu.com/p/3e6094c15a46?_t_t_t=0.30564603745006025)