【问题标题】:How to get all GitHub API results?如何获取所有 GitHub API 结果?
【发布时间】:2021-06-04 21:04:41
【问题描述】:

我使用 GitHub 搜索 API 进行存储库搜索。我知道如何从第 3、第 4 等页获得结果。 (https://api.github.com/search/repositories?q=java&page=2&per_page=30>)。为此,我在代码中使用了这种方法:


      private void pagesPagination() {
            recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    if (!recyclerView.canScrollVertically(1) && dy != 0) {
                        if (layoutManager.findLastCompletelyVisibleItemPosition() ==
                                adapter.getItemCount() - 1) {
                          page++;
                     itemViewModel.searchItems(q, page, resultsPerPage);
                        itemViewModel.getNewItem().observe(MainActivity.this, responseObject -> {
                            adapter.addItems(responseObject.get(0).getItems());
                        });
                        }
                    }
                }
            });
        }
    }

 public class ItemViewModel extends AndroidViewModel {

    private ItemRepository itemRepository;
    private LiveData<Root> itemsResponseLiveData;
    private List<Root> items;
    private MutableLiveData<List<Root>> addedItems;

    public ItemViewModel(@NonNull Application application) {
        super(application);
    }

    public void init() {
        itemRepository = new ItemRepository();
        itemsResponseLiveData = itemRepository.getItemsResponseLiveData();
        items = new ArrayList<>();
        addedItems = new MutableLiveData<List<Root>>();
    }

    public Root addItem() {
     return itemsResponseLiveData.getValue();
    }

    public void searchItems(String q, int page, int resultsPerPage) {
        itemRepository.fetchData(q, page, resultsPerPage);
        items.add(addItem());
        addedItems.setValue(items);
    }

    public LiveData<Root> getItemsResponseLiveData() {
        return itemsResponseLiveData;
    }
    public MutableLiveData<List<Root>> getNewItem(){
        return addedItems;
    }
}

在适配器类中:

public void addItems(List<Item> newItem ) {
    items.addAll(newItem);
    notifyDataSetChanged();
}

但如果我向下滚动这个新列表,我看不到以前的结果。我可以这样做吗?我可以查看所有以前页面的所有结果吗?

【问题讨论】:

    标签: android github-api


    【解决方案1】:

    您的问题可能在于您如何在 ViewModel 中使用 LiveData,

    如果您使用liveData.setValue(newList),则不会追加新项目,而是将值设置为仅新列表,

    在您的情况下,您可能需要将旧项目保存在 ArrayList 中,一旦获得新项目,首先将它们附加到 ArrayList 中,然后使用 liveData.setValue(arrayList) 将所有项目放入 liveData 中,适配器将接收所有项目来自它

    查看此答案,您将找到有关此解决方案的更多信息和代码

    Notify Observer when item is added to List of LiveData

    【讨论】:

    • 问题是首先你得到了 itemsResponseLiveData 上的数据,并用 0 个项目创建了新的 itemsResponseLiveDatas,然后监听 itemsResponseLiveData 所以你也只会得到新的数据,要解决这个问题你有 2选项,首先修改存储库代码以使其具有 MutableLiveData 和 ArrayList,然后仅侦听此实时数据,另一种选择是移动以从存储库中删除 LiveData 对象并在 ViewModel 中执行第一个想法,即最好的,将使存储库更清洁
    • 流程将在 ViewModel 中执行 repo 请求并将结果附加到 ArrayList,然后使用 setValue 将此 ArrayList 添加到 LiveData,并监听此实时数据,您将获得正确的值跨度>
    • 好的,看,我改变了 ViewModel 类(更新的问题),在活动类中我调用了这个方法:` itemViewModel.getNewItem().observe(this, responseObject -> adapter.notifyDataSetChanged()); `我做错了什么?
    • addItem 应该从实时数据中获取项目,而不是空的 ArrayList,应该像这样 addItem(itemsResponseLiveData.value);
    • 我改为:`public void addItem() { newItems.addAll(itemsResponseLiveData.getValue().getItems()); addedItems.setValue(newItems); }' 但itemsResponseLiveData.getValue().getItems() 始终为空
    猜你喜欢
    • 2021-08-23
    • 2016-07-31
    • 2021-03-04
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 2019-11-12
    • 2015-01-31
    相关资源
    最近更新 更多