RecyclerView onBindViewHolder,未调用有效负载

时间:2016-09-10 21:55:53

标签: android android-recyclerview

好的,我没有想到如何解决这个问题...我试图用有效负载实现带有负载的RecyclerViews适配器onBindViewHolder,因为我在每个适配器项目上使用延迟加载来加载额外的信息对于RV上的每张卡/物品。

所以我的问题是,即使我使用我使用的有效负载调用notifyItemChanged(这是一个简单的字符串),当它到达onBindViewHolder时,有效负载列表总是为空:S。 当然我用Google搜索了它,所有的帖子(btw的3个帖子的数量很棒)说我必须覆盖DefaultItemAnimator上的方法canReuseUpdatedViewHolder才能返回true以使有效负载工作。所以我继续这样做,完全没有用。

经过一些猴子测试(在任何项目完成加载之前完全向下滚动),我发现有时一个有效负载成功传递给onBindViewHolder ...... 挖掘更多,我继续设置并停止设置我从模型上的Lazy Loading WS下载的额外信息。直到我发现罪魁祸首是我在我的模型上设置一个巨大的字符串值(用于渲染图表,所以期望它在最坏的情况下大~5mb ...但通常是〜200k),如果我注释掉那行代码,该死的有效载荷传来......没有失败!即使我的有效载荷是一个简单的字符串!

我在这里开始相信巫术......

我试过的其他东西: 1)在适配器上使用setHasStableIds(true)(当然在getItemId()方法上使用唯一值) 2)创建了我自己的ItemAnimator,它扩展自DefaultItemAnimator。我也发现animateChange从未被调用过...... 3)将ItemAnimator设置为NULL

我认为RV会将给定的模型附加到当前的ViewHolder,因为它对我来说没有意义,这种行为只有在设置那么大的字符串时才会发生...

任何建议或资源都会有所帮助......

1 个答案:

答案 0 :(得分:0)

嗯,这导致我的getItemViewType逻辑错误了...当我的额外WS完成时,我正在更改getItemViewType上使用的一些信息,所以我以前的ViewHolder类型与最新版本不同一个要设置,所以RV将作为完全替换处理它。