android recyclerview 增加了数据视图不更新?

如题;相关代码如下,网络请求是异步操作(回调不是在主线程中),请问各位大佬该如何解决?

初始化 recyclerview 代码:

UserRecyclerviewAdapter userRecyclerviewAdapter = new UserRecyclerviewAdapter(this.fragment.getActivity());
// 设置列表填充器
this.binding.users.setAdapter(userRecyclerviewAdapter);
// 一定要设置布局管理器,否则界面不会渲染
this.binding.users.setLayoutManager(new LinearLayoutManager(this.fragment.getContext()));

更新数据的代码如下:

public void getData(boolean append) {
        // ... 省略部分代码
        UserApi api = new UserApi(activity);
        api.index(dto)
                .thenAccept((response) -> {
                    List<IndexUserApiResponseDTO.User> data = res.getContent();
                    UserRecyclerviewAdapter adapter = (UserRecyclerviewAdapter) this.binding.users.getAdapter();
                    List<UserRecyclerviewAdapter.Item> items = new ArrayList<>();
                    data.stream().forEach(user -> {
                        IndexUserApiResponseDTO.User.UserArchive userArchive = user.getUserArchive();
                        if (userArchive == null) {
                            return ;
                        }
                        UserRecyclerviewAdapter.Item item = new UserRecyclerviewAdapter.Item();
                        item.setCover(userArchive.getCover());
                    });
                        // ... 省略部分代码
                    // 这边更新了数据但是界面没有渲染!!!!
                    if (append) {
                        adapter.addAll(items);
                    } else {
                        adapter.resetAll(items);
                    }
                })
                .exceptionally(LogUtils::throwException)
                .thenRun(() -> {
                   // ... 省略部分代码
                });
    }

适配器代码如下

public class UserRecyclerviewAdapter extends RecyclerView.Adapter<UserViewHolder> {

    private final Activity activity;

    private final List<Item> items = new ArrayList<>();

    public UserRecyclerviewAdapter(Activity activity) {
        this.activity = activity;
    }

    public static class Item {
        private String cover;
        // ..
    }

    @NonNull
    @NotNull
    @Override
    public UserViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {
        LogUtils.debug("onCreateViewHolder");
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_home_recyclerview_user, parent, false);
        return new UserViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull @NotNull UserViewHolder holder, int position) {
        LogUtils.debug("onBindViewHolder");
        Item item = this.items.get(position);
        holder.getTitleView().setText(item.getTitle());
         // ...
    }

    @Override
    public int getItemCount() {
        LogUtils.debug("getItemCount");
        return this.items.size();
    }

    @SuppressLint("NotifyDataSetChanged")
    public void addAll(List<Item> items) {
        this.items.addAll(items);
        this.notifyDataSetChanged();
    }

    @SuppressLint("NotifyDataSetChanged")
    public void resetAll(List<Item> items) {
        this.items.clear();
        this.items.addAll(items);
        this.notifyDataSetChanged();
    }
}
阅读 3.5k
1 个回答
✓ 已被采纳

有几个可能导致数据不更新:

  1. 确保在数据更新后,调用了notifyDataSetChanged()方法来通知适配器数据已更改。在以下代码片段中,你的适配器似乎缺少了这一步骤:
if (append) {
    adapter.addAll(items);
} else {
    adapter.resetAll(items);
}
adapter.notifyDataSetChanged(); // 添加这一行代码
  1. 确保数据集合 items 不为空。如果 items 是空的,那么即使调用了 addAll()resetAll(),也不会触发数据更新。你可以在更新数据前加入以下检查:
if (items.isEmpty()) {
    return;
}
  1. 确保每个 Item 对象都被正确地设置了数据。在你的代码片段中,item.setCover(userArchive.getCover()); 是在循环内部调用的,但是其他数据都没有被设置。你需要为 Item 对象设置完整的数据。
  2. 最后,如果你的网络请求是异步执行的,确保 UI 线程在网络请求完成后能够正确接收到数据。你可以使用 runOnUiThread() 方法来确保数据更新在主线程中执行:
activity.runOnUiThread(() -> {
    if (append) {
        adapter.addAll(items);
    } else {
        adapter.resetAll(items);
    }
    adapter.notifyDataSetChanged();
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题