Android简单的两级评论功能实现
Android简单的两级评论功能实现
前言
在App开发过程中,做了文章页面,那评论的功能自然是必不可少的,怎么做呢,如果只是做一个简单的评论不带回复功能的话,那和之前做毕设时候的我也看不到进步呀,这怎么行呢?于是我打开‘稀土掘金’App,随便看了几个文章,试了试评论的功能,于是便开始了我的构思。我想要实现的效果如下图所示,如何实现这样一个页面呢?我使用的方法是RecyclerView中再嵌套一个RecyclerView,一个用来展示一级评论,另一个则用来展示相应的二级评论,思路有了,下面就开始我的实现。
一、数据库
1、构建数据库
要想做好一个功能,数据库的构建是重中之重。下图是我构造的评论实体类:
评论表中包含如下字段:
- id --评论主键(自动生成)
- newsId -- 主键
- number -- 评论的用户主键
- content -- 评论内容
- time -- 评论时间
- level -- 评论级别(有两级,当评论的对象是文章作者时,level为1,当评论对象为文章内的评论时,level为2,默认level为1)
- replyNumber -- 评论回复的用户主键
- replyId -- 评论回复的评论主键(只有level为2的评论才会用到该字段,所以默认为空)
replyNumber其实这里不应该默认为空的,因为无论是那种类型的回复,都是有对应的用户的,这个疏忽也造成了我在后面构建“我的评论”界面时,无法展示出文章作者的详细信息。
2、封装数据库
数据访问层Dao主要封装了对数据库的访问:
很平常的SQL语句,只简单说明下:分别是添加评论、根据id删除评论、获取该文章的所有评论、获取该用户的所有评论、通过id获取该评论
(省略了CommentTask接口即实现)
最后在仓库层将这些方法都封装起来,方便后续调用,如下图所示:
二、布局
1、文章详情界面的评论布局
就是个RecyclerView哈哈
2、评论的适配器布局
可以看到适配器布局中还包含了一个RecyclerView,这里面展示的就是二级评论
3、二级评论的适配器布局
这个布局很简单,就由几个TextView组件构成
三、代码逻辑
首先,在ViewModel层初始化该文章的所有评论,观察评论数据变化,给评论适配器数据赋值并刷新,在评论适配器中再对level为2的评论数据进行过滤并赋值给回复适配器。
1、获取评论数据
var comments = MutableLiveData<List<CommentInfo>>()
comments.value = commentStoreRepository.getCommentsByNewId(newsId)
通过文章的id获取到评论
2、给评论适配器数据赋值
3、在评论适配器处理数据
首先,评论适配器中的数据是通过文章的id获取到的所有评论,包含了一级和二级评论,在评论适配器展示的当然不能是所有的评论,而是所有一级的评论,而二级评论的数据需要再进行过滤传递给回复适配器
所以,在绑定ViewHolder以及getItemCount时,需要对传递的数据进行过滤,
如图所示,allList
是通过文章的id获取到的所有评论,list
是level为1的所有评论,replyList
是level为2的所有评论。getItemCount
返回的是一级评论的个数。在绑定ViewHolder时,将一些回调函数和一级评论和二级评论列表传递进去,接着就看ViewHolder中的数据处理逻辑,如下两张图
这张图只是一些简单的一级数据的赋值和一些回调参数的调用传参
这里首先对二级评论进行过滤,过滤出与该条一级评论相关联的二级评论,接着对布局进行一些操作,接着是赋值操作和回复适配器中一些函数的实现。
4、在回复适配器处理数据
在这里就不需要对数据进行处理了,只有简单的赋值和回调了
5、回调函数的实现
四、实现效果
1、评论功能
2、我的评论展示
这里的“@3333333333”就是因为replyNumber为空的导致无法展示出文章作者的详细信息,只有展示用户主键了,后面再进行修改。
五、结语
就这样,一个简单的二级评论功能就完成了。文章若出现错误,欢迎各位批评指正,写文不易,转载<
来源:juejin.cn/post/7271991667246694437