如何获取 RecyclerView 的项目列表<T>?

How to get a List<T> of items for a RecyclerView?

我开始使用 Amplify Framework,并且正在关注 AWS 博客中的 Building an Android app with AWS Amplify – Part 1。那里使用的代码似乎已过时 (2018),因为在 Amplify 库中没有类似的代码。

我卡在了需要显示 RecyclerView 项的部分。在那篇文章中,您可以获得这样的项目:

response.data().listPets().items()

但是,在当前文档中,有一个 response.getData() 方法,其中 returns 一个 Iterator<T>,您可以循环使用。

我想要一个 List<T> 来喂 RecyclerView.Adapter

请指教

AppSync SDK 与 Amplify Android?

2018 年的博客是用 AWS Android AppSync SDK in mind. The README on the AppSync SDK includes notes on code generation from a schema file 写的。如果您将继续关注 2018 年的博客,我会用该文档补充您的练习。

今年,AWS 的 public 文档已更新,将客户指向新的 Amplify Android library. The Amplify CLI (amplify) has also been updated to work with the Amplify Android library. The Amplify CLI will currently generate Java code that can be used by the Amplify Android API and DataStore 类别。

TLDR,如果你刚开始,我会在 the Tutorial section of the AWS Amplify Android docs 开始工作。

还有a more recent (May 2020) blog post about AppSync that you can follow, here

Iterator<T>RecyclerView.Adapater

有很多方法可以将结果传递到适配器,复杂程度各不相同。

最直接的方法是这样的:

首先,用 List<SomeModel> 备份您的适配器。根据设计,List<SomeModel> 可以在创建 ItemAdapter 更新

final class ItemAdapter implements RecyclerView.Adapter<ItemHolder> {
    private final List<SomeModel> data;

    ItemAdapter(List<SomeModel> data) {
        this.data = data;
    }
}

然后,在 Amplify 回调中,更新 List,并通知适配器数据集已更改:

List<SomeModel> models = new ArrayList<>();
ItemAdapter adapter = new ItemAdapter(models);
Amplify.API.query(SomeModel.class,
    iterator -> {
        if (!iterator.hasNext()) return;
        models.clear();
        while (iterator.hasNext()) {
            models.add(iterator.next());
        }
        adapter.notifyDataSetChanged();
    },
    failure -> {
        // As an exercise: display an
        // error item into the RecyclerView.
    }
);

我一直在跟踪 Amplify 中的最新实现,使用 RxAmplify 和一个内部使用 rxJava 的示例待办事项应用程序。所以我使用下面的代码查询数据存储并获取可用于更新 recyclerview 适配器的值列表。

toList()

部分将查询结果转换为可在适配器中使用的列表。

RxAmplify.DataStore.query(Todo.class)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .toList()
            .subscribe(todolist->{
                adapter.updateList(todolist);
                adapter.notifyDataSetChanged();
            });

部分

.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread())

很重要,否则您将无法访问 UI,并且会抛出异常。