RecyclerView和ListView

1.缓存机制基本一致

1). mActiveViews和mAttachedScrap功能相似,意义在于快速重用屏幕上可见的列表项ItemView,而不需要重新createView和bindView;
2). mScrapView和mCachedViews + mReyclerViewPool功能相似,意义在于缓存离开屏幕的ItemView,目的是让即将进入屏幕的ItemView重用.

3). RecyclerView的优势在于a.mCacheViews的使用,可以做到屏幕外的列表项ItemView进入屏幕内时也无须bindView快速重用;b.mRecyclerPool可以供多个RecyclerView共同使用,在特定场景下,如viewpaper+多个列表页下有优势.客观来说,RecyclerView在特定场景下对ListView的缓存机制做了补强和完善。




2. 缓存层级不同

1). RecyclerView缓存RecyclerView.ViewHolder,抽象可理解为:
View + ViewHolder(避免每次createView时调用findViewById) + flag(标识状态);标志flag的作用是判断view是否需要重新bindView,这也是RecyclerView实现局部刷新的一个核心.
2). ListView缓存View。
3).listview是2级缓存view
4)RecyclerView是四级缓存ViewHolder
好处是可以减少bindview的耗时.

3.使用上的差别

(1)RecyclerView 复用 Item 的工作 Google 全帮你搞定,不再需要像 ListView 那样自己调用 setTag
RecyclerView 需要多出一步 LayoutManager 的设置工作
(2) recyclerView支持LinearLayoutManager(线性布局效果)、GridLayoutManager(网格布局效果)、StaggeredGridLayoutManager(瀑布流布局效果). 另外通过LayoutManager可以实现自定义效果的布局.
(3)空数据处理
ListView 提供了 setEmptyView 这个 API 来让我们处理 Adapter 中数据为空的情况,只需轻轻一 set 就能搞定一切。
而RecyclerView并没有提供类似的API
(4)HeaderView FooterView
在 ListView 的设计中,存在着 HeaderView 和 FooterView 两种类型的视图,并且系统也提供了相应的 API 来让我们设置

RecyclerView中可以重写getItemViewType,
onCreateViewHolder针对各种type进行创建holder
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case VIEW_TYPE_HEADER
case VIEW_TYPE_FOOTER:
return new FooterViewHolder(mInflater.inflate(R.layout.recycler_footer_view, parent, false));
default:
final RecyclerView.ViewHolder holder = onCreateDefaultViewHolder(parent, viewType);
if (holder != null) {
holder.itemView.setTag(holder);
holder.itemView.setOnLongClickListener(onLongClickListener);
holder.itemView.setOnClickListener(onClickListener);
}
return holder;
}
}

在onBindViewHolder进行初始化.
(5)item刷新
RecyclerView提供局部刷新接口
listview可以自定义更新特定的item
public View getView(int position, View convertView, ViewGroup parent) {
...
return convertView;
}

/**
* 更新Item视图,减少不必要的重绘
*
* @param listView
* @param position
*/
public void updateItemView(ListView listView, int position) {
//换算成 Item View 在 ViewGroup 中的 index
int index = position - listView.getFirstVisiblePosition();
if (index >= 0 && index < listView.getChildCount()) {
//更新数据
AuthorInfo authorInfo = mAuthorInfoList.get(position);
authorInfo.setNickName("Google Android");
authorInfo.setMotto("My name is Android .");
authorInfo.setPortrait(R.mipmap.ic_launcher);
//更新单个Item
View itemView = listView.getChildAt(index);
getView(position, itemView, listView);
}
}
(6)动画效果
RecyclerView 封装了一些动画效果可以方便调用, RecyclerView 则为我们提供了很多基本的动画 API ,如下方的增删移改
如果你对动画效果有追求,觉得系统提供的并不能满足你的需求,也可以通过相应接口实现自己的动画效果,方式也非常简单,继承 RecyclerView.ItemAnimator 类,并实现相应的方法,再调用 RecyclerView 的 setItemAnimator(RecyclerView.ItemAnimator animator) 方法设置完即可实现自定义的动画效果。

listview中也有一些第三方库, 可以供使用.如: ListViewAnimations

(7) 监听 Item 的事件
RecyclerView的onclickItem可用如下实现:
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case VIEW_TYPE_HEADER:
case VIEW_TYPE_FOOTER:
default:
final RecyclerView.ViewHolder holder = onCreateDefaultViewHolder(parent, viewType);
if (holder != null) {
holder.itemView.setTag(holder);
holder.itemView.setOnLongClickListener(onLongClickListener);
holder.itemView.setOnClickListener(onClickListener);
}
return holder;
}
}

(8)RecyclerView有一套嵌套滚动机制, 可是实现父容器的事件响应.
Touch 事件在进行分发的时候,由父 View 向它的子 View 传递,一旦某个子 View 开始接收进行处理,那么接下来所有事件都将由这个 View 来进行处理,它的 ViewGroup 将不会再接收到这些事件,直到下一次手指按下。而嵌套滚动机制(NestedScrolling)就是为了弥补这一机制的不足,为了让子 View 能和父 View 同时处理一个 Touch 事件。关于嵌套滚动机制(NestedScrolling),实现上相对是比较复杂的,此处就不去拓展说明,其关键在于NestedScrollingChild 和 NestedScrollingParent 两个接口


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值