在 PagedListAdapter 中未调用 onCreateViewHolder

Posted

技术标签:

【中文标题】在 PagedListAdapter 中未调用 onCreateViewHolder【英文标题】:onCreateViewHolder not called in PagedListAdapter 【发布时间】:2019-09-29 13:34:35 【问题描述】:

我有 PagedListAdapater

class TrackedActivityAdapter constructor(diffUtilCallback: DiffUtil.ItemCallback<TrackedActivity>) :
    PagedListAdapter<TrackedActivity, TrackedActivityAdapter.TrackedActivityHolder>(diffUtilCallback) 

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TrackedActivityHolder 
        val inflater = LayoutInflater.from(parent.context)
        val view = DataBindingUtil.inflate<ActivityItemBinding>(inflater, R.layout.activity_item, parent, false)
        return TrackedActivityHolder(view)
    

    override fun onBindViewHolder(holder: TrackedActivityHolder, position: Int) 
        getItem(position)?.let  holder.bind(it) 
    

    class TrackedActivityHolder(var binding: ActivityItemBinding) : RecyclerView.ViewHolder(binding.root) 

        fun bind(trackedActivity: TrackedActivity) 
            binding.activity = trackedActivity
            binding.executePendingBindings()
        

    

以及此适配器在其中创建的片段:

class HistoryFragment : DaggerFragment() 
    @Inject
    lateinit var viewModelFactory: ViewModelProvider.Factory

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? 
        val binding = DataBindingUtil.inflate<HistoryFragmentViewBinding>(
            inflater,
            R.layout.history_fragment_view,
            container,
            false
        )
        val historyViewModel = ViewModelProviders.of(this, viewModelFactory).get(HistoryViewModel::class.java)
        val adapter = TrackedActivityAdapter(TrackedActivity.DIFF_CALLBACK)
        binding.trackedActivityRv.adapter = adapter
        binding.trackedActivityRv.layoutManager = LinearLayoutManager(binding.root.context)
        historyViewModel.getTrackedActivities().observe(this,
            Observer<PagedList<TrackedActivity>>  t ->
                adapter.submitList(t)
            )
        binding.executePendingBindings()
        return binding.root
    

在调用了 adapter.submitList (t) 方法之后。什么也没发生,onCreateViewHolder 和 onBindViewHolder 方法都没有被调用,请告诉我可能有原因,我就是不明白(

【问题讨论】:

我遇到了类似的问题 - 结果我已经完成了adapter.setHasStableIds(true),然后忘记实现adapter#getItemId 【参考方案1】:

您是否尝试过使用HistoryFragmentViewBinding.inflate(inflater) 而不是DataBindingUtil.inflate()

我遇到了同样的问题,并且卡了好几天。原来我只是在最后返回了错误的视图。它不像你的,但可能值得一试。

【讨论】:

【参考方案2】:

我有同样的问题。和你只差一行,代码完全一样。就我而言

recyclerview.setHasFixedSize(true)

已添加。当我删除它时,调用了 onCreateViewHolder() 。 所以,我不知道你的代码的哪一部分是问题,但也尝试处理这部分。

val adapter = TrackedActivityAdapter(TrackedActivity.DIFF_CALLBACK)
binding.trackedActivityRv.adapter = adapter
binding.trackedActivityRv.layoutManager = LinearLayoutManager(binding.root.context)
binding.executePendingBindings()

【讨论】:

以上是关于在 PagedListAdapter 中未调用 onCreateViewHolder的主要内容,如果未能解决你的问题,请参考以下文章

如何在提交时删除 Intellij IDEA 中未使用的导入?

带有 PhpWord 的隐蔽 HTML:错误 - DOMDocument::loadXML(): 实体中未定义 p 上的命名空间前缀 o

在 useEffect() 中未调用函数

在 UICollectionViewController 中未调用 searchbarsearchbuttonclicked

在 iPad 中未调用supportedInterfaceOrientations

在 Android 中未调用 onlocationchanged