封装 ViewHolder 功能以供重用
Posted
技术标签:
【中文标题】封装 ViewHolder 功能以供重用【英文标题】:Encapsulate ViewHolder Functionality for reuse 【发布时间】:2016-03-19 23:41:27 【问题描述】:我有一个带有新闻提要的应用程序。我正在使用回收站视图来填充我的新闻提要。根据从服务器接收到的内容类型,我有 10 种用于回收站视图的视图。 一切正常。
我的问题是,当用户在回收站视图中单击该项目时,用户会被带到一个新片段,其中包含以下内容和所有 cmets。
我的问题是这是一个新片段,所以我不在回收站视图中。在这种情况下,我必须夸大在 recyclerview 中单击的项目的布局,这很好。但是,它应该具有提要中项目的所有功能,例如,播放媒体(视频、音频)、导航到新片段。
我的问题,是否有可能在 recyclerview 中封装 viewholder 的功能?否则将重复相同的功能。
任何帮助表示赞赏。
我附上了一张图来帮助说明。
【问题讨论】:
我认为这应该可以解决您的问题:guides.codepath.com/android/… 您在显示Fragment Replies
时遇到问题吗?
@ChintanSoni 不,显示回复没有问题。我需要在新片段中的视图之外的视图中的功能
@ChintanSoni 这就是我已经用我的多个视图持有者实现的,但是,它是我需要重用的视图持有者中的功能。
你成功了吗?
【参考方案1】:
class VideoViewHolder(
private binding: VideoItemBinding
) : RecyclerView.ViewHolder(binding.root)
companion object
fun create(
inflater: LayoutInflater,
viewGroup: ViewGroup
): VideoViewHolder
val binding = DataBindingUtil.inflate<VideoItemBinding>(
inflater, R.layout.item_video, viewGroup, false
)
return VideoViewHolder(binding)
fun bind(video: Video)
// bind view to video model
// set click listeners
// fire network request on click events and on response check if the viewholder is binded to same model else its has been reused.
来自视频适配器
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder
return VideoViewHolder.create(inflater, parent)
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
when (holder)
is VideoViewHolder ->
holder.bind(item as Video, doubtsRepo)
在没有适配器的情况下在活动/片段/容器布局中重用手动创建viewholder并调用其绑定函数
val vh = VideoViewHolder.create(inflater, parent)
// get view from vh.binding.root and manually add it to view container and then bind the model to the view to reuse view holder functionality without any changes.
vh.bind(video)
【讨论】:
不要将片段放在视图中 @EpicPandaForce 你看到了什么问题? 除非您在 XML 中使用带有<fragment
的膨胀片段,否则您无法确定这样做的结果是什么。以上是关于封装 ViewHolder 功能以供重用的主要内容,如果未能解决你的问题,请参考以下文章
封装使用ViewHolder模式的Adapter组件,及用其快速实现聊天界面
RecyclerView中ViewHolder重用机制理解(解决图片错乱和闪烁问题)
Android性能优化之Listview(ViewHolder重用机制)