如何获得所有 GitHub API 结果?
How to get all GitHub API results?
我使用 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;
}
}
在适配器中 class:
public void addItems(List<Item> newItem ) {
items.addAll(newItem);
notifyDataSetChanged();
}
但是如果我向下滚动这个新列表,我看不到以前的结果。我可以看到之前所有页面的所有结果吗?
您的问题可能在于您如何在 ViewModel 中使用 LiveData,
如果您使用 liveData.setValue(newList)
这将不会附加新项目,相反,它只会将值设置为新列表,
在您的情况下,您可能需要将旧项目保存在 ArrayList 中,一旦获得新项目,首先将它们附加到 ArrayList 中,然后使用 liveData.setValue(arrayList)
将所有项目放入 liveData 中,适配器将从中接收所有物品
查看此答案,您将找到有关此解决方案的更多信息和代码
Notify Observer when item is added to List of LiveData
我使用 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;
}
}
在适配器中 class:
public void addItems(List<Item> newItem ) {
items.addAll(newItem);
notifyDataSetChanged();
}
但是如果我向下滚动这个新列表,我看不到以前的结果。我可以看到之前所有页面的所有结果吗?
您的问题可能在于您如何在 ViewModel 中使用 LiveData,
如果您使用 liveData.setValue(newList)
这将不会附加新项目,相反,它只会将值设置为新列表,
在您的情况下,您可能需要将旧项目保存在 ArrayList 中,一旦获得新项目,首先将它们附加到 ArrayList 中,然后使用 liveData.setValue(arrayList)
将所有项目放入 liveData 中,适配器将从中接收所有物品
查看此答案,您将找到有关此解决方案的更多信息和代码
Notify Observer when item is added to List of LiveData