class TopicListItemViewHolder extends RecyclerView.ViewHolder {
private ItemTopicListBinding mBinding;
TopicListItemViewHolder(ItemTopicListBinding binding) {
super(binding.getRoot());
mBinding = binding;
}
void bind(Topic topic) {
// get topic attributes, here is where the NPE is thrown because topic is not initiated and so is null
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
Topic topic = mTopics.get(position);
Log.d(TAG, topic.getCreator().getName());
Log.d(TAG, topic.getCreator().getThumbnailImageUrl());
switch (holder.getItemViewType()) {
case DEFAULT_TOPIC_CARD:
((TopicListItemViewHolder) holder).bind(topic);
}
}
所以我遇到了一个问题,我检索了一大堆json,它在RecyclerView中呈现。偶尔,我得到一个NullPointerException,因为在onBindViewHolder
中,Topic
项的一部分在调用bind()
时仍然为空,只有几毫秒太慢了。这只发生在返回巨型json中的第四个Topic
的第三个之后(总共Topic
个,因为这就像一个家庭饲料)。
我知道这个问题是由于将json反序列化为Topic
对象或Glide加载来自imageUrl的数据需要花费的时间太长,只要onBindViewHolder
太过于渴望并因此被称为仍然完全启动Topic
。
我不确定是否有办法延迟bind
,直到当前绑定的Topic
项已满载?我使用的是谷歌的官方数据绑定框架,所以他们必须考虑到这样的问题吗?
当然,或者提高反序列化的性能,但是json太复杂了,所以我不能。
答案 0 :(得分:0)
您可以在加载完成后启动适配器。
您可以在启动适配器时传递空ArrayList<Topic>
,并在加载数据后调用adapter.notifyDataSetChanged();
。