如何在加载数据时仍然在onBindViewHolder中延迟bind()(需要几毫秒才能完全加载)?

时间:2018-03-26 17:26:58

标签: android performance android-recyclerview

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太复杂了,所以我不能。

1 个答案:

答案 0 :(得分:0)

  1. 您可以在加载完成后启动适配器。

  2. 您可以在启动适配器时传递空ArrayList<Topic>,并在加载数据后调用adapter.notifyDataSetChanged();