RecyclerView &ListView
1. RecyclerView &ListView类型
RecyclerView | ListView |
java.lang.Object android.view.View android.view.ViewGroup android.support.v7.widget.RecyclerView | java.lang.Object android.view.View android.view.ViewGroup android.widget.AdapterView android.widget.AbsListView android.widget.ListView |
2.使用简介
RecyclerView是一个ViewGroup,能配合任何基于adapter的view实现多种布局, 使用步骤:
(1)需要添加依赖,compile 'com.android.support:recyclerview-v7:+'
(2)需要给RecyclerView设置一个布局管理器LayoutManager
(3)需要设置Adapter,但是RecyclerView的adapter继承自RecyclerView.Adapter<>,需要实现3个方法:
- onCreateViewHolder()
- onBindViewHolder()
- getItemCount()
3. RecyclerView特性(相对于ListView而言)
RecyclerView控件和ListView的原理有很多相似的地方,都是维护少量的View来进行显示大量的数据,不过RecyclerView控件比ListView更加高级并且更加灵活。当我们的数据因为用户事件或者网络事件发生改变的时候也能很好的进行显示。和ListView不同的是,RecyclerView不用再负责Item的显示相关的功能,所有有关布局,绘制,数据绑定等都被分拆成不同的类进行管理。
(1)ViewHolder:内部类 继承 RecyclerView.ViewHolder,保存视图引用,adapter继承自一个泛型类,泛型类型是ViewHolder,它可以实现组件的复用,它是RecyclerView的内部类,需要开发者自己实现
-
ListView ViewHolder需开发者自定义,用来缓存listview的数据,否则每次getView的时候都会调用性能损耗较大的findViewById(),这将导致ListView性能展示迟缓。
(2)ItemDecorator在滚动上面的功能扩展了许多,在垂直和水平方向的滚动都提供了支持
-
ListView Android API只提供在垂直方向上滚动的支持
(3) LayoutManager,设置每一项view在RecyclerView中的位置布局以及控件item view的显 示或者隐藏.当View重用或者回收的时候,LayoutManger都会向Adapter来请求新的数据来进行替换原来数据的内容。这种回收重用的机制可以提供性能。用户可以创建自定义布局管理器,扩展RecyclerView.LayoutManager类,此外RecyclerView提供了三个内置的布局管理器:
LinearLayoutManager,可以支持水平和竖直方向上滚动的列表
StaggeredGridLayoutManager,可以支持交叉网格风格的列表,类似于瀑布流或者Pinterest
GridLayoutManager,支持网格展示,可以水平或者竖直滚动,如展示图片的画廊
(4) SmothScroller
(5) ItemAnimator起初使用 ViewPropertyAnimator属性动画来实现列表动画,RecyclerView.ItemAnimator则被提供用于在RecyclerView添加、删除或移动item时处理动画效果。还可以使用DefaultItemAnimator。RecyclerView提供了更多的方法控制,只需调用以下几个函数:notifyItemChanged(int)、notifyItemInserted(int)、notifyItemRemoved(int)、notifyItemRangeChanged(int, int)、notifyItemRangeInserted(int, int)、 notifyItemRangeRemoved(int,int)
-
ListView添加数据和删除数据时,在add后使用notifydatasetchanged即可
(6) ItemDecoration 给每一项Item添加子View,比如灵活自定义各种间隔
-
ListView添加间隔符使用divider属性设置
4.下拉刷新
RecyclerView的下拉刷新:
(1)SwipeRefreshLayout包裹RecyclerView布局:(系统自带的,只是下拉的时候布局并没有被下拉,需要自定义)
//监听刷新
swipeRefreshLayout.setOnRefreshListener(//curPage = 1;loadNetworkData();)
//加载完成,消失图标
swipeRefreshLayout.setRefreshing(false);
(2)PullToRefreshRecyclerView第三方类库:library_pullToReflect
(3)PtrFrameLayout:(需要导包,依赖项) 包裹RecyclerView
//有两种Header:
①、旋转圆圈的header(类似SwipeRefreshLayout)
Ⅰ、new一个StoreHouseHeader header,然后设置:
header.setBackgroundColor
header.setTextColor
header.initWithString("LOADING...")
Ⅱ、添加header,ptrFrameLayout.setHeaderView(header);
Ⅲ、绑定UI与刷新状态的监听:ptrFrameLayout.addPtrUIHandler(header);
Ⅳ、添加刷新动作监听:ptrFrameLayout.setPtrHandler(newPtrDefaultHandler)
②、默认的经典header(类似pullTorefresh效果)
Ⅰ 、new一个PtrClassicDefaultHeader
Ⅱ、添加header,ptrFrameLayout.setHeaderView(header);
Ⅲ、绑定UI与刷新状态的监听:ptrFrameLayout.addPtrUIHandler(header);
Ⅳ、添加刷新动作监听:ptrFrameLayout.setPtrHandler(newPtrDefaultHandler)
// 刷新完成,让刷新Loading消失
ptrFrameLayout_main.refreshComplete();
-
ListView的下来刷新:自定义刷新控件继承自ListVIew
5. RecyclerView的优点
(1)封装了viewholder的回收复用,ListView自定义ViewHolder来缓存元素的布局信息以提高性能,而RecyclerView本身就提供了ViewHolder,我们只要继承自该ViewHolder就可以了,至于ViewHolder怎么存储,系统会自动帮我们做。
(2)使用布局管理器管理子view的位置,能够使用复杂的布局来展示一个动态组件。
(3)自带了ItemAnimation
(4)隔开了view设置(onCreateViewHolder),和数据的绑定(onBindViewHolder)
6.注意问题
问题1:没有addFooterView 和addHeaderView方法
问题2:RecyclerView没有默认的分割线,需要自定义ItemDecoration,而ListView是需要设置属性实现
问题3: 不提供setOnItemClickListener方法设置Item的点击事件,长按事件,而ListView提供了该接口
解决方法:首先在Adapter里定义一个内部接口,接口内定义回调函数,然后向外暴露一个设置这个接口对象的方法,通过这个方法设置内部接口的对象
//Item的回调接口
public interface OnItemClickListener {
void onItemClickListener(Viewview, int position);
}
private OnItemClickListenerlistener; // 点击Item的回调对象
//设置回调监听
public voidsetOnItemClickListener(OnItemClickListener listener) {
this.listener =listener;
}
最后在ViewHolder绑定数据的方法(onBindViewHolder)中,通过接口对象调用接口方法,将相关信息传递出去。主页就可以调用setOnItemClickedListener(new ...)