listview与recycler区别

今天这篇文章主要是向大家介绍 RecyclerView 和 ListView 的使用对比,文章主要包括以下几点的内容:

RecyclerView 和 ListView 布局效果的对比

RecyclerView 和 ListView 一些常用的功能 和 API 的对比

RecyclerView 和 ListView 在 Android L 引入嵌套滚动机制之后的对比
有一点需要强调下,文中所有的效果在真机上都是很流畅的,因为录制 GIF 图很容易掉帧,所以特地放慢了操作,千万不要误会成卡顿了啊!

布局效果对比

作为一枚控件,要引起开发者使用的欲望自然先是从显示效果看起(看脸的世界),ListView 大家对效果已经很熟悉了,这里直接跳过,而作为 RecyclerView,它能带给效果要比 ListView 强大得多
Android 默认提供的 RecyclerView 就能支持 线性布局、网格布局、瀑布流布局 三种(这里我们暂且不提代码细节,后文再说),而且同时还能够控制横向还是纵向滚动。怎样,从效果上足以碾压 ListView 有木有。

横向滚动的ListView开源控件是不是可以不用再找了?对,你没看错!
瀑布流效果的开源控件是不是可以不用再找了?对,你没看错!
连横向滚动的GridView都不用找了!对,你没看错!
到此,展示效果上的差距一目了然。

API 使用对比

当然,一个控件我们不能完全只看效果,关键还是要看实用性,看看有没有方便我们调用的 API提高我们的开发效率。所以,接下来我们就从各个方面来看看 RecyclerView 和 ListView 在提供的API调用上的一些实践比较。

基础使用

ListView 的基础使用大家再熟悉不过,其使用的关键点主要如下:

继承重写 BaseAdapter 类
自定义 ViewHolder 和 convertView 一起完成复用优化工作
由于 ListView 已经老生常谈,所以此处就不去写示例代码了。 RecyclerView 基础使用关键点同样有两点:

继承重写 RecyclerView.Adapter 和 RecyclerView.ViewHolder
设置布局管理器,控制布局效果
示例代码大致如下:

// 第一步:继承重写 RecyclerView.Adapter 和 RecyclerView.ViewHolder
public class AuthorRecyclerAdapter extends RecyclerView.Adapter {

...

@Override
public AuthorViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    ...
    return viewHolder;
}

@Override
public void onBindViewHolder(AuthorViewHolder holder, int position) {
    ...
}

@Override
public int getItemCount() {
    if (mData == null) {
        return 0;
    }
    return mData.size();
}

class AuthorViewHolder extends RecyclerView.ViewHolder {

    ...

    public AuthorViewHolder(View itemView) {
        super(itemView);
        ...

    }
}

}

mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerAdapter = new AuthorRecyclerAdapter(mData);

// 第二步:设置布局管理器,控制布局效果
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(RecyclerDemoActivity.this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(linearLayoutManager);

mRecyclerView.setAdapter(mRecyclerAdapter);
从基础使用上看,我们明显可以看出,RecyclerView 相比 ListView 在基础使用上的区别主要有如下几点:

ViewHolder 的编写规范化了
RecyclerView 复用 Item 的工作 Google 全帮你搞定,不再需要像 ListView 那样自己调用 setTag
RecyclerView 需要多出一步 LayoutManager 的设置工作
布局效果

在最开始就提到,RecyclerView 能够支持各种各样的布局效果,这是 ListView 所不具有的功能,那么这个功能如何实现的呢?其核心关键在于 RecyclerView.LayoutManager 类中。从前面的基础使用可以看到,RecyclerView 在使用过程中要比 ListView 多一个 setLayoutManager 步骤,这个 LayoutManager 就是用于控制我们 RecyclerView 最终的展示效果的。
而 LayoutManager 只是一个抽象类而已,系统已经为我们提供了三个相关的实现类 LinearLayoutManager(线性布局效果)、GridLayoutManager(网格布局效果)、StaggeredGridLayoutManager(瀑布流布局效果)。如果你想用 RecyclerView 来实现自己 YY 出来的一种效果,则应该去继承实现自己的 LayoutManager,并重写相应的方法,而不应该想着去改写 RecyclerView。