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();
}
}
回答:
有几个可能导致数据不更新:
- 确保在数据更新后,调用了
notifyDataSetChanged()
方法来通知适配器数据已更改。在以下代码片段中,你的适配器似乎缺少了这一步骤:
if (append) { adapter.addAll(items);
} else {
adapter.resetAll(items);
}
adapter.notifyDataSetChanged(); // 添加这一行代码
- 确保数据集合
items
不为空。如果items
是空的,那么即使调用了addAll()
或resetAll()
,也不会触发数据更新。你可以在更新数据前加入以下检查:
if (items.isEmpty()) { return;
}
- 确保每个
Item
对象都被正确地设置了数据。在你的代码片段中,item.setCover(userArchive.getCover());
是在循环内部调用的,但是其他数据都没有被设置。你需要为Item
对象设置完整的数据。 - 最后,如果你的网络请求是异步执行的,确保 UI 线程在网络请求完成后能够正确接收到数据。你可以使用
runOnUiThread()
方法来确保数据更新在主线程中执行:
activity.runOnUiThread(() -> { if (append) {
adapter.addAll(items);
} else {
adapter.resetAll(items);
}
adapter.notifyDataSetChanged();
});
以上是 android recyclerview 增加了数据视图不更新? 的全部内容, 来源链接: utcz.com/p/945325.html