RecyclerView浅析

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)

你可能感兴趣的:(RecyclerView浅析)