问题
在完成阳光沙滩博客App的摸鱼板块时,选择了使用微信朋友圈的布局,然后在针对每一条摸鱼记录中评论数据展示出现了数据复用的问题。 整个布局是采用RecyclerView来展示的,而评论整个一块,我选择的是去通过放置一个LinearLayout布局用于占位,然后往其中添加TextView。
如何解决?
目前采用的方案是在列表进行请求的时候,同时去请求每一个动态的评论列表,然后使用Map将请求结果保存下来,在后续UI渲染的时候直接从Map中读取数据。
能够解决数据复用的情况,但是也存在一些网络请求的延迟,但是第一屏的评论在刷新后才会展示。 目前的展示效果:
为什么会出现这种问题?
猜测和RecyclerView的复用机制有关,因为我之前的做法是在Viewholder,bind的时候去加载评论列表的,网络请求存在延时导致出现的问题。
我是通过LiveData来监听的数据是否回来了。
moYuViewModel.commentResult.observe(itemView.context as AppCompatActivity) {
if (it.data.list.isNotEmpty()) {
binding.llComment.visibility = View.VISIBLE
MoYuCommentItemViewFactory.createItems(itemView.context, binding.llComment,it.data)
} else {
binding.llComment.visibility = View.GONE
}
}
因为这里没有办法区分回来的请求是不是属于该ViewHolder的,如果是才进行更新。
也去网上搜索相关的解决文章,发现其中的一些解决方法是废弃掉RecyclerView的缓存机制,显然并不能直接这么粗暴的处理,毕竟列表的加载如果不依赖于缓存机制那么整个列表的性能在数据比较多的情况下就很糟糕。
但目前现在采取的方式也是存在较大的问,如果后续数据特别多,Map对空间的消耗也比较大,拟采用LRU算法来解决这个问题。
大家针对这个问题有更优的解决方案吗?