封装 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 中使用带有 &lt;fragment 的膨胀片段,否则您无法确定这样做的结果是什么。

以上是关于封装 ViewHolder 功能以供重用的主要内容,如果未能解决你的问题,请参考以下文章

封装使用ViewHolder模式的Adapter组件,及用其快速实现聊天界面

RecyclerView中ViewHolder重用机制理解(解决图片错乱和闪烁问题)

Android性能优化之Listview(ViewHolder重用机制)

Android-进一步封装ViewHolder

android 怎么在外面拿recyclerview 中viewholder的控件

OBIEE - 保存静态文本视图以供重用