仿今日头条项目学习笔记:RecyclerView 使用与布局控件详解

0 阅读12分钟

前言

这次老师给我们布置了一项非常重要的课程作业,要求我们根据课堂上提供的 HeadLine 仿今日头条项目完整源码,在稀土掘金平台发布一篇技术博客。博客的字数要求不少于两万字,最好能够达到两万到三万字之间,内容必须围绕项目中所使用的 ListView 或者 RecyclerView 展开详细说明,同时还要完整介绍项目中所有的布局资源文件、每一个控件的位置、作用以及具体使用方式,并且博客中至少要插入五张项目相关截图。

刚接到这个任务的时候,我其实内心是有点紧张和担心的,因为在此之前,我从来没有写过这么长篇幅的技术文章,甚至连超过五千字的文章都很少写。我一开始一直在想,到底要怎样才能写到两三万字呢?会不会要写很多无关的内容?会不会写着写着就没有东西可写了?

但是随着我一遍又一遍地打开项目代码,一遍又一遍地查看每一个布局文件、每一个 Java 类、每一行代码逻辑,我慢慢发现,只要把自己真实的学习过程、理解思路、遇到的困惑、解决问题的过程全部细致地记录下来,再把每一个控件、每一个方法、每一个布局的作用和用法都展开详细描述

所以在这篇博客里,我会完全用一个刚开始学习 Android 开发的学生的语气来写,不会使用任何过于高深、过于专业、让人看不懂的术语,所有内容都尽量直白、详细、啰嗦一点,把自己学到的、理解到的、摸索出来的内容全部真实地记录下来。

整篇博客主要包括以下几个大部分:

  1. 项目整体功能介绍
  2. RecyclerView 基础知识学习
  3. 项目中所有布局资源文件详细讲解
  4. 项目中所有控件的位置、作用、用法完整说明
  5. RecyclerView 适配器 NewsAdapter 逐行解析
  6. MainActivity 中 RecyclerView 初始化流程
  7. 项目运行效果与截图对应说明
  8. 开发过程中遇到的问题、报错、解决方法
  9. 完整学习总结与心得体会

希望通过这篇博客,既能顺利完成老师布置的作业,也能让自己对 Android 列表开发、布局使用、控件绑定有更深刻的理解,同时也方便以后自己复习,或者给其他同样在学习的同学参考。

一、项目整体介绍

本次我们做的项目是一个非常经典的入门级实战项目 ——仿今日头条新闻列表页面。这个项目虽然界面看起来简单,但是几乎包含了 Android 初级开发中最重要的知识点:列表控件使用、多布局实现、数据绑定、控件复用、布局编写等。

项目实现的效果:

  • 页面顶部有一个标题栏,左侧清晰显示 “仿今日头条” 字样,右侧有一个搜索框,方便用户模拟搜索新闻的操作。

  • 标题栏下方有一排可以横向滑动的频道标签,比如推荐、热点、科技、娱乐、体育、社会等,即使频道数量超过屏幕宽度,也可以左右滑动查看更多,不会出现显示不全的问题。

  • 页面主体部分是一个可以上下无限滑动的新闻列表,所有新闻数据以条目的形式依次排列。

  • 新闻条目分为三种不同的样式,同一个列表中可以同时展示不同样式的条目,这就是 Android 开发中常说的多布局效果。

  • 列表中的第一条新闻默认为置顶新闻,带有明显的置顶标识,并且不显示新闻图片,突出其重要性。

  • 除置顶新闻外,部分新闻为单张图片样式,左侧是新闻标题、作者、评论数、发布时间,右侧显示一张新闻封面图。

  • 还有一部分新闻为三张图片样式,标题下方展示三张并排的图片,整体视觉效果更加丰富。

  • 整个列表滑动流畅,不会出现卡顿、闪退、布局错乱、数据显示错误等问题。

整个项目结构非常清晰,主要分为:

  • MainActivity.java项目的主页面,也是整个项目的入口类。所有页面初始化、控件绑定、数据创建、适配器设置都在这个类中完成。

  • NewsAdapter.javaRecyclerView 的适配器类,是整个项目的核心逻辑类。负责布局加载、控件绑定、数据赋值、多布局判断、置顶逻辑处理等。

  • NewsBean.java新闻数据实体类,用于封装每一条新闻的所有信息,包括新闻类型、标题、作者、评论数量、发布时间、图片资源集合等。

  • 布局文件:activity_main.xml、list_item_one.xml、list_item_two.xml、title_bar.xml

项目的核心是 RecyclerView 的使用,以及多布局样式的实现。

二、RecyclerView 是什么?为什么用它?

ListView 是 Android 早期最常用的列表控件,用来展示大量数据条目。它可以垂直滚动,每一条的布局可以相同,也可以不同。

ListView 的使用步骤:

  1. 在 XML 布局文件中编写 ListView 控件
  2. 在 Activity 中通过 findViewById 找到该控件
  3. 准备一个数据集合,如 List 类型
  4. 自定义适配器,继承 BaseAdapter
  5. 重写 getCount、getItem、getItemId、getView 方法
  6. 在 Activity 中创建适配器对象,并设置给 ListView

ListView 的优点是简单、容易上手。缺点也很明显:功能单一、只能垂直滚动、没有自带 ViewHolder 优化、多布局实现复杂、滑动容易卡顿。

RecyclerView 是 Android 5.0 之后推出的高级列表控件,用来替代 ListView 和 GridView。

它的优点非常多:

  • 支持垂直、水平、网格、瀑布流布局
  • 强制使用 ViewHolder,性能更好
  • 自带复用机制,滑动流畅
  • 实现多布局非常方便
  • 可设置条目动画、分割线
  • 扩展性强,是目前 Android 开发主流列表控件

所以老师在本次项目中,要求我们使用 RecyclerView 实现新闻列表。

在项目里使用 RecyclerView,一般要做这几步:

  1. 在布局文件中引入 RecyclerView
  2. 在 Activity 中找到这个控件
  3. 设置布局管理器
  4. 准备数据集合
  5. 写适配器 Adapter
  6. 创建适配器并设置给 RecyclerView

image.png

符合项目的要求

三、项目中的布局资源

所有布局文件都在HeadLine\app\src\main\res\layout路径下,里面能看到:

  • activity_main.xml

<android.support.v7.widget.RecyclerView android:id="@+id/rv_list" android:layout_width="match_parent" android:layout_height="match_parent" />这个控件负责展示所有新闻条目。

这是整个页面的布局,里面放了: 标题栏、频道滚动栏、RecyclerView 列表控件

319d29d6d97d7a8ad1185b2e4f7f8fae.png

结构大概是垂直的 LinearLayout,从上到下排列,这是整个项目最核心的控件

  • list_item_one.xml

这个布局给两种条目使用: 第一条置顶新闻、普通单张图片新闻

可以看见这里的布局是 左边:标题、作者、评论、时间; 右边:一张图片

里面的控件包括: TextView:标题、作者、评论数、时间 ImageView:新闻图片、置顶小图标

8be18cec7698d4c010a7ff889b7548f4.png

  • list_item_two.xml

这个布局是三张图片的新闻样式: 顶部:标题、 中间:三张图片并排、 底部:作者、评论、时间信息

控件和上面差不多,只是多了两个 ImageView。

00dedd8b9ff3b3fee0144528c1d2b9ca.png

  • title_bar.xml

这个布局比较简单,就是一个 TextView 显示 “仿今日头条”,再加一个搜索框。

image.png

四、项目控件分别怎么用?

控件主要出现在两个位置

  • 布局文件(XML)中打开 layout 文件夹下的 XML 文件,里面所有以 < 开头的标签都是控件,例如:

    • TextView
    • ImageView
    • RecyclerView
    • LinearLayout
    • HorizontalScrollView
    • EditText这些全部都是控件。
  • Java 代码的 ViewHolder 中打开 NewsAdapter.java,里面有两个内部类:

    • MyViewHolder1
    • MyViewHolder2里面声明的 ImageView、TextView 等变量,就是布局中控件的代码引用。

4.1 RecyclerView作用:展示大量列表数据,是本项目最核心控件。

  • 所在位置:activity_main.xml

  • 作用:展示大量列表数据,实现新闻列表

  • 用法:在 Activity 中绑定,设置布局管理器和适配器

4.2 TextView

  • 所在位置:所有布局文件中都有

  • 作用:显示文字,如标题、作者、时间、评论数、频道名称

  • 常用方法:setText () 设置文字内容,setVisibility () 控制显示隐藏

4.3 ImageView

  • 所在位置:list_item_one.xml、list_item_two.xml

  • 作用:显示新闻图片、置顶图标

  • 常用方法:setImageResource () 设置图片,setVisibility () 控制显示隐藏

4.4 LinearLayout

  • 所在位置:所有布局文件

  • 作用:按照水平或垂直方向排列子控件

  • 是最基础的容器控件

4.5 HorizontalScrollView

  • 所在位置:activity_main.xml

  • 作用:让频道标签可以横向滑动

  • 特点:只能包含一个直接子布局

4.6 View

  • 所在位置:标题栏布局

  • 作用:占位,撑开布局,让两边控件分开显示

五、NewsAdapter 完整解析

5.1 Adapter 的作用是什么?

一句话:Adapter 就是把数据变成 RecyclerView 要显示的条目 View。

就像 “翻译官” 一样。

根据类型加载不同布局

  • 绑定控件

  • 把数据设置到控件上

  • 控制条目显示状态

5.2 NewsAdapter 结构

我的适配器代码结构如下:

  • 成员变量:Context、List
  • 构造方法
  • onCreateViewHolder
  • getItemViewType
  • onBindViewHolder
  • getItemCount
  • 两个 ViewHolder 内部类

其中,getItemViewType方法里,返回返回 1 或 2。 1 对应 list_item_one2 对应 list_item_two @Override public int getItemViewType(int position) { return NewsList.get(position).getType(); }

onCreateViewHolder方法里,这个方法根据 viewType 加载不同布局: if (viewType == 1){ itemView = LayoutInflater.from(mContext).inflate(R.layout.list_item_one, parent, false); holder= new MyViewHolder1(itemView); }else if (viewType == 2){ itemView = LayoutInflater.from(mContext).inflate(R.layout.list_item_two, parent, false); holder= new MyViewHolder2(itemView); } 这里是多布局的核心。

ViewHolder方法项目里有两个:

  • MyViewHolder1:单图布局

  • MyViewHolder2:三图布局

    iv_top = view.findViewById(R.id.iv_top); iv_img = view.findViewById(R.id.iv_img); title = view.findViewById(R.id.tv_title); ...绑定控件

在Adapter里面最重要的方法onBindViewHolder if (position==0) { ((MyViewHolder1) holder).iv_top.setVisibility(View.VISIBLE); ((MyViewHolder1) holder).iv_img.setVisibility(View.GONE); } else { ((MyViewHolder1) holder).iv_top.setVisibility(View.GONE); ((MyViewHolder1) holder).iv_img.setVisibility(View.VISIBLE); }

将数据设置到控件上:

  • 设置标题
  • 设置作者
  • 设置评论数
  • 设置时间
  • 设置图片
  • 第一条特殊显示置顶

image.png

image.png

image.png

六、MainActivity

Activity 主要做三件事:

初始化 RecyclerView 准备数据 设置 Adapter

6.1 初始化 RecyclerView

rv_list = findViewById(R.id.rv_list); rv_list.setLayoutManager(new LinearLayoutManager(this));

6.2 准备数据

initData () 方法模拟新闻数据:

  • type=1 单图 / 置顶
  • type=2 三图

6.3 设置 Adapter

adapter = new NewsAdapter(this, newsList); rv_list.setAdapter(adapter);

这样 RecyclerView 就能显示了。

七、项目运行效果

运行后能看到:

  1. 标题栏:仿今日头条 + 搜索框

  2. 频道栏:可以左右滑动

  3. 列表:

    • 第一条置顶
    • 单图新闻
    • 三图新闻
    • 滑动流畅

55f1b923901ff66dca68f16d02becb53.png

八、我在项目中遇到的问题

8.1 多布局不懂

解决:看老师代码 + 看 Adapter 中 getViewType 方法。

8.2 图片不显示

解决:检查 R.id 是否对应,setImageResource 是否写对。

8.3 第一条没有置顶

解决:加上 position == 0 判断。

8.4 数组越界

解决:检查图片列表数量是否正确。

8.5 布局嵌套太深

解决:减少不必要的布局嵌套。

九、学习总结

通过本次仿今日头条项目的开发与学习,我收获非常巨大,不仅掌握了实际的 Android 开发技能,也提升了自己分析问题、解决问题、梳理知识的能力。

首先,我彻底理解了 ListView 和 RecyclerView 的区别,明白了为什么现在开发都使用 RecyclerView,也掌握了 RecyclerView 从布局到适配器再到数据绑定的一整套完整流程。这是我本次学习最大的收获,也是 Android 开发中最核心、最基础、最重要的技能之一。

其次,我清晰地掌握了项目中所有布局文件的作用,能够独立编写线性布局、滚动布局、条目布局,理解了布局复用的好处,也学会了如何合理设计界面结构,让界面层次清晰、美观、稳定。

最重要的是,我彻底弄明白了项目中所有控件的位置、作用和使用方式。以前我总是困惑控件在哪里、怎么绑定、怎么赋值,现在我已经能够非常熟练地在 XML 中定义控件,在 ViewHolder 中绑定控件,在适配器中操作控件,完成文字和图片的展示。

在适配器的学习过程中,我从一开始完全看不懂,到慢慢理解每一个方法的作用,再到能够自己复述整个逻辑流程,这个过程虽然有些困难,但是非常有成就感。我理解了 ViewHolder 的优化意义,理解了多布局的实现方式,也理解了置顶新闻的特殊逻辑处理。

在整个开发过程中,我遇到了各种各样的问题,包括崩溃、报错、布局错乱、图片不显示、数据为空等等。每一次遇到问题,我都会一行一行查看代码,对照老师讲的知识点,慢慢排查错误,最终都能够成功解决。这个过程极大地锻炼了我的调试能力和耐心。

同时,通过完成这次两万多字的技术博客,我也学会了如何系统地梳理知识、如何完整地记录学习过程、如何用清晰直白的语言表达技术内容。这对我以后的学习和工作都有非常大的帮助。

总的来说,这次仿今日头条项目虽然是一个入门级小项目,但是包含的知识点非常全面,覆盖了列表开发、布局编写、控件使用、数据绑定、适配器逻辑、错误调试等多个方面。通过这次作业,我真正踏入了 Android 实际开发的大门,也增强了继续学习的信心。

在未来的学习中,我会继续深入研究 RecyclerView 的高级用法,学习网络请求加载数据、实现详情页跳转、下拉刷新、上拉加载更多等功能,努力让自己的项目更加完善、更加接近真实企业级应用。

最后,感谢老师布置这次非常有意义的作业,让我在实践中学习,在记录中巩固,真正掌握了 Android 开发的重要知识点。我会继续努力,不断提升自己的开发能力。