前言
这次老师给我们布置了一项非常重要的课程作业,要求我们根据课堂上提供的 HeadLine 仿今日头条项目完整源码,在稀土掘金平台发布一篇技术博客。博客的字数要求不少于两万字,最好能够达到两万到三万字之间,内容必须围绕项目中所使用的 ListView 或者 RecyclerView 展开详细说明,同时还要完整介绍项目中所有的布局资源文件、每一个控件的位置、作用以及具体使用方式,并且博客中至少要插入五张项目相关截图。
刚接到这个任务的时候,我其实内心是有点紧张和担心的,因为在此之前,我从来没有写过这么长篇幅的技术文章,甚至连超过五千字的文章都很少写。我一开始一直在想,到底要怎样才能写到两三万字呢?会不会要写很多无关的内容?会不会写着写着就没有东西可写了?
但是随着我一遍又一遍地打开项目代码,一遍又一遍地查看每一个布局文件、每一个 Java 类、每一行代码逻辑,我慢慢发现,只要把自己真实的学习过程、理解思路、遇到的困惑、解决问题的过程全部细致地记录下来,再把每一个控件、每一个方法、每一个布局的作用和用法都展开详细描述
所以在这篇博客里,我会完全用一个刚开始学习 Android 开发的学生的语气来写,不会使用任何过于高深、过于专业、让人看不懂的术语,所有内容都尽量直白、详细、啰嗦一点,把自己学到的、理解到的、摸索出来的内容全部真实地记录下来。
整篇博客主要包括以下几个大部分:
- 项目整体功能介绍
- RecyclerView 基础知识学习
- 项目中所有布局资源文件详细讲解
- 项目中所有控件的位置、作用、用法完整说明
- RecyclerView 适配器 NewsAdapter 逐行解析
- MainActivity 中 RecyclerView 初始化流程
- 项目运行效果与截图对应说明
- 开发过程中遇到的问题、报错、解决方法
- 完整学习总结与心得体会
希望通过这篇博客,既能顺利完成老师布置的作业,也能让自己对 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 的使用步骤:
- 在 XML 布局文件中编写 ListView 控件
- 在 Activity 中通过 findViewById 找到该控件
- 准备一个数据集合,如 List 类型
- 自定义适配器,继承 BaseAdapter
- 重写 getCount、getItem、getItemId、getView 方法
- 在 Activity 中创建适配器对象,并设置给 ListView
ListView 的优点是简单、容易上手。缺点也很明显:功能单一、只能垂直滚动、没有自带 ViewHolder 优化、多布局实现复杂、滑动容易卡顿。
RecyclerView 是 Android 5.0 之后推出的高级列表控件,用来替代 ListView 和 GridView。
它的优点非常多:
- 支持垂直、水平、网格、瀑布流布局
- 强制使用 ViewHolder,性能更好
- 自带复用机制,滑动流畅
- 实现多布局非常方便
- 可设置条目动画、分割线
- 扩展性强,是目前 Android 开发主流列表控件
所以老师在本次项目中,要求我们使用 RecyclerView 实现新闻列表。
在项目里使用 RecyclerView,一般要做这几步:
- 在布局文件中引入 RecyclerView
- 在 Activity 中找到这个控件
- 设置布局管理器
- 准备数据集合
- 写适配器 Adapter
- 创建适配器并设置给 RecyclerView
符合项目的要求
三、项目中的布局资源
所有布局文件都在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 列表控件
结构大概是垂直的 LinearLayout,从上到下排列,这是整个项目最核心的控件
- list_item_one.xml
这个布局给两种条目使用: 第一条置顶新闻、普通单张图片新闻
可以看见这里的布局是 左边:标题、作者、评论、时间; 右边:一张图片
里面的控件包括: TextView:标题、作者、评论数、时间 ImageView:新闻图片、置顶小图标
- list_item_two.xml
这个布局是三张图片的新闻样式: 顶部:标题、 中间:三张图片并排、 底部:作者、评论、时间信息
控件和上面差不多,只是多了两个 ImageView。
- title_bar.xml
这个布局比较简单,就是一个 TextView 显示 “仿今日头条”,再加一个搜索框。
四、项目控件分别怎么用?
控件主要出现在两个位置
-
布局文件(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); }
将数据设置到控件上:
- 设置标题
- 设置作者
- 设置评论数
- 设置时间
- 设置图片
- 第一条特殊显示置顶
六、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 就能显示了。
七、项目运行效果
运行后能看到:
-
标题栏:仿今日头条 + 搜索框
-
频道栏:可以左右滑动
-
列表:
- 第一条置顶
- 单图新闻
- 三图新闻
- 滑动流畅
八、我在项目中遇到的问题
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 开发的重要知识点。我会继续努力,不断提升自己的开发能力。