当前位置: 首页 > 知识库问答 >
问题:

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

琴镜
2023-08-31

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

初始化 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个答案

陆晓博
2023-08-31

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

  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();});
 类似资料:
  • xml视图绑定如下: 为什么我点击了按钮更新了 level 但是显示的文本没有更新?

  • 问题内容: 我目前正在尝试弄清楚如何在不重新加载整个页面的情况下更改路由参数。例如,如果我从 http://www.example.com/#/page 但将名称更新为“乔治”,将路线更改为: http://www.example.com/#/page/george 如果我已经路由了http://www.example.com/#/page/:name。 无需重新加载位置。可以只设置$ route

  • 如何使用数据砖增量从其他表中更新表中的多个记录。 我想达到这样的目标: 它失败并出现错误:不匹配的输入“发件人”期望

  • tl;dr:ngOnChanges显示在输入属性上检测到更改,但视图未更新 我正在开发一个Angular(2+)应用程序,试图为一个异步任务创建一个进度条,该任务由一个服务使用可观察的。Observable将数字作为数据推送,以指示任务已完成的百分比。涉及三个部分:服务、ResultsComponent和ProgressBarComponent(ResultsComponent的子级)。基本数据流

  • 在我的angular 6应用程序中,我从存储选择器获取数据,存储选择器反过来使用effect从API获取数据,从父级,我将该数据作为异步管道注入子组件,如下所示: 子组件模板

  • 我正在从ListView迁移到RecyclerView,但是在SQLite中输入一些数据之后,我的列表没有使用notifyDataSetChanged()更新;所以我总是必须调用setAdapter()方法; 回收器ViewAdapter 观赏者 模型