如何在App启动时加载DataStore数据并展示到RecyclerView
问题根因
两个核心逻辑错误导致启动时无法自动加载渲染列表:
- 页面初始化阶段未给RecyclerView绑定适配器。
recyclerView.setAdapter(adapter)逻辑仅写在按钮点击回调中,不触发点击就不会完成适配器绑定,列表自然无法展示内容。 - Amplify的API查询是异步执行的,调用
apiQuery()后不会阻塞等待结果返回,此时初始化适配器绑定的arrayList是空的;后续查询结果返回时,回调默认执行在子线程,你仅向集合中添加了数据,既没有切回主线程(Android所有UI操作必须在主线程执行),也没有通知适配器数据源发生变化,适配器不会主动触发视图刷新。
修复方案
按以下逻辑调整代码即可,不需要用户手动点击,页面加载后会自动拉取数据渲染:
- 适配器初始化完成后立刻绑定给RecyclerView,删除按钮触发绑定的测试逻辑
- 查询成功回调中切回主线程更新数据,数据添加完成后通知适配器刷新列表
修复后的完整代码如下:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 加载Fragment布局 View view = inflater.inflate(R.layout.fragment_home, container, false); recyclerView = view.findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); arrayList = new ArrayList<>(); // 初始化适配器后立刻绑定到RecyclerView,不需要等点击触发 adapter = new MyAdapter(getContext(), arrayList); recyclerView.setAdapter(adapter); // 页面初始化时直接触发数据查询 apiQuery(); // 测试用的按钮逻辑可直接删除 // view.findViewById(R.id.button2).setOnClickListener(...); return view; } private void apiQuery(){ Amplify.API.query( ModelQuery.list(Todo.class, Todo.NAME.contains(" ")), response -> { // Amplify回调默认在子线程,必须切到主线程才能更新UI requireActivity().runOnUiThread(() -> { for (Todo todo : response.getData()) { arrayList.add(todo); Log.i("MyAmplifyApp", todo.getName()); } // 数据加载完成后通知适配器刷新列表 adapter.notifyDataSetChanged(); }); }, error -> Log.e("MyAmplifyApp", "Query failure", error) ); }
优化建议
- 如果列表数据量较大,建议将普通
RecyclerView.Adapter替换为ListAdapter,通过submitList()方法更新数据,内置差分更新能力,不需要手动调用notifyDataSetChanged(),列表刷新更流畅、性能更好。 - 如果要实现类YouTube、Instagram的秒开体验,可以在查询时优先拉取DataStore本地缓存的旧数据先渲染,等网络请求返回最新数据后再更新列表,避免用户进入页面看到空白占位。
- 注意不要在子线程直接做任何UI相关操作,否则会出现概率性崩溃、视图不刷新的问题。
内容的提问来源于stack exchange,提问作者Aparichit_Coder
相关产品推荐
相关产品推荐

