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();

}

}


回答:

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

  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();

});

以上是 android recyclerview 增加了数据视图不更新? 的全部内容, 来源链接: utcz.com/p/945325.html

回到顶部