我们应该使用RecyclerView来取代ListView吗?

时间:2015-02-08 09:43:15

标签: android listview android-recyclerview

Android文档说:

  

RecyclerView小部件是一个更高级,更灵活的版本   列表显示。此小组件是用于显示大型数据集的容器   通过保持有限的数量可以非常有效地滚动   观点。有数据收集时使用RecyclerView小部件   其元素在运行时根据用户操作或网络而更改   事件

如果效率不重要,ListView实际上可以完成以上所有操作,当我们使用RecyclerView替换ListView时,我们发现了很多问题:

  1. 列表项选择没有onItemClickListener() - solution

  2. 列表项之间没有分隔符 - solution

  3. 没有内置重叠选择器,单击列表项时没有视觉反馈 - solution

  4. 列表标题没有 addHeaderView - solution

  5. 也许更多问题......

    因此,当我们使用RecyclerView替换ListView时,我们必须进行额外的编码以达到与ListView相同的效果。

    问题:

      
        
    • 我们是否值得将ListView替换为RecyclerView
    •   
    • 如果没有,那么在哪种情况下我们应该更好地使用RecyclerView代替ListView,反之亦然?
    •   

7 个答案:

答案 0 :(得分:117)

如果ListView适合您,则没有理由进行迁移。 如果您正在编写新的UI,那么使用RecyclerView可能会更好。

当您需要自定义列表或想要更好的动画时,RecyclerView功能强大。 ListView中的这些便捷方法给人们带来了很多麻烦,这就是为什么RecyclerView为他们提供了更灵活的解决方案。

迁移所需的主要更改是在适配器中。如果你想继续打电话notifyDataSetChanged,你就失去了大部分动画片。约束利益。但是,如果您可以更改适配器以分派详细的通知事件(添加/删除/移动/更新),那么您可以获得更好的动画和性能。这些事件让RecyclerView选择了正确的动画,它还有助于避免不必要的onBind调用。如果您的商品浏览量很复杂,您将获得巨大的收益。此外,未来,RecyclerView将会有更多组件。

答案 1 :(得分:23)

据我所知,如果ListView满足您应用的所有当前需求并满足所有用例,则无需使用RecyclerView替换它。

RecyclerView以增加开发人员的复杂性为代价,为开发人员提供了巨大的力量。有些事情可以在ListView中轻松完成,现在可以花费很多不必要的努力。

但是,是的,ListView可以做很多事情,比如令人惊讶的LayoutManager功能,它可以让你动态地将布局无缝地改为水平,垂直,网格或交错网格。

我写了一篇关于这个主题的详细答案here

答案 2 :(得分:8)

1 您可以使用界面提供点击侦听器。我也将这种技术用于ListViews 2 没有分隔符:只需在行中添加宽度为 match_parent 且高度为 1dp 的视图,并为其指定背景颜色即可。
3 只需使用StateList选择器作为行背景 也可以在ListViews中避免使用 4 addHeaderView:只需将标题放在视图之外。

因此,如果你关心效率,那么,用RecyclerView替换ListView是一个好主意。

答案 3 :(得分:5)

直到最近,我仍然对非常简单的列表使用ListView。例如,如果我想显示一个简单的文本选项列表...

我的决定基于“人为因素”,即如果性能不重要,则用更少的代码创建一个简单的ListView会更好。我经常想起一个大学教授,他喜欢这样说:“我的老师帕斯卡(Pascal)的发明家伟大的尼古拉斯·沃斯(Niclaus Wirth)曾经说过,如果一个程序有50行以上的代码,那肯定是错的……”

但是说服我停止使用ListView的是,它最近已与RelativeLayout一起移入了Android Studio设计工具中的“旧版”类别。

https://developer.android.com/reference/android/widget/ListView

我认为这是“弃用”的“软”形式。如果实际上不建议使用它,并且所有尽职尽责的开发人员将其代码移至RecyclerView,将会造成破坏性的影响。

此外,ListView的简介在顶部警告说RecyclerView是更好的选择:“要使用更现代,灵活和高效的方法来显示列表,请使用RecyclerView。”
https://developer.android.com/reference/android/widget/ListView

此外,ListView指南仍在讨论游标加载程序,但是getSupportCursorLoader()本身在API 28中已被弃用。
https://developer.android.com/guide/topics/ui/layout/listview

Android Studio的最新增强功能:

  

文件->新建->片段->片段(列表)

这为我们提供了一个工作正常的RecylerView,其中填充了基本文本。这摆脱了我使用ListView的最后一个真实原因,因为现在设置基本的RecylerView变得一样容易。

总而言之,我不打算将ListView完全用于新开发,因为将其标记为“旧版”距离淘汰它仅一步之遥。

答案 4 :(得分:3)

当列表不是动态的或受网络事件影响时,唯一可以使用ListView的情况。例如:导航。

对于任何其他用途,RecyclerView使ListView黯然失色。由于RecyclerView只关心回收,因此更容易做出与ListView紧密耦合的视觉相关事物,如更改位置/重新排列,动画(事实上它附带RecyclerView.ItemAnimator),自定义布局(除了库存还有StaggeredGrid)旧的列表或网格样式,但也有这个library,它扩展了更多)。

此外,如果您想使用CardView,我相信这是唯一的方法(一些good reading何时使用卡片或列表。)

答案 5 :(得分:1)

一个很好的选择是使用BaseAdapter。它支持使用Viewholder模式,我的包含100多行,包含位图和按钮,它运行非常流畅。

答案 6 :(得分:0)

RecyclerViewListView和GridView的高级版本,具有改进的性能和其他优点。它比ListView和GridView更加灵活和高效。

RecyclerView是一个ViewGroup,用于基于大量数据项显示元素的垂直和水平滚动列表。 RecyclerView是android support-v7版本的小部件。

RecyclerView小部件是一个用于显示大型数据集的容器,该容器可以通过维护有限数量的视图而非常高效地滚动,并且元素会在运行时根据用户操作或网络事件而变化。

要在Android中实现RecyclerView,只需添加以下代码:

  1. 在项目build.gradle文件中实现RecyclerView库:

    implementation 'com.android.support:recyclerview-v7:28.0.0-rc01'
    
  2. 将RecyclerView添加到您的主布局:

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="2dp">
    
    </android.support.v7.widget.RecyclerView>
    
  3. 创建自定义布局资源文件-

  4. 创建自定义适配器类-
  5. 现在最终创建一个CustomAdapter和setAdapter()的实例到RecyclerView或仅实现以下代码:

    RecyclerView rv = (RecyclerView)findViewById(R.id.rv);
    ad = new CustomAdapter(MainActivity.this,drawableArray,titleArray,subtitleArray);
    rv.setAdapter(ad);
    rv.setLayoutManager(new LinearLayoutManager(this));
    rv.setHasFixedSize(true);
    

How to implement Recycler view in android app ?

快乐编码...