Android ViewModel загружает больше данных, когда прокрутка фрагмента заканчивается - PullRequest
0 голосов
/ 22 сентября 2019

Я новичок в Android, поэтому не знаю, как это сделать

У меня есть фрагмент с представлением списка.Мне нужно, чтобы фрагмент мог определить, что прокрутка представления списка достигла конца, и для этого я могу сделать следующее

listView.setOnScrollListener(onScrollListener());
private OnScrollListener onScrollListener() {
  return new OnScrollListener() {

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
      int threshold = 1;
      int count = listView.getCount();

      if (scrollState == SCROLL_STATE_IDLE) {
        if (listView.getLastVisiblePosition()>=count-threshold&&pageCount < 2) 
        {
          Log.i(TAG, "loading more data");
          // Execute LoadMoreDataTask AsyncTask
          getDataFromUrl(url_page2);
        }
      }
    }
  }
}

Однако в приведенном выше коде мы используем локальный метод getDataFromUrl и вместо этогоМне нужно сказать ViewModel, чтобы загрузить больше данных и обновить фрагмент с LiveData

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

В вашем фрагменте

yourViewModel.getDataFromUrl().observe(this, new Observer<ArrayList<Slider>>() {
            @Override
            public void onChanged(ArrayList<YourDataType> datasServer) {
                //when data changes you get here...so notify adapter accordingly
            }
        });

это будет наблюдать изменение данных в вашей ViewModel

В вашей ViewModel создайте этот тип данных

private MutableLiveData<ArrayList<YourDataType>> data;
private ArrayList<YourDataType> serverDatas= new ArrayList<>();

Теперь создайте getDataFromUrl () в вашей viewModel и внутри вашего

ответа (...) с сервера создайте цикл и добавьте данные в AttayList serverDatas:

YourDataType yourDataType = new YourDataType(....);

serverDatas.add(yourDataType);

наконец

data.setValue(serverDatas);
0 голосов
/ 22 сентября 2019

Создайте свой собственный слушатель прокрутки.

public abstract class EndlessScrollListener extends RecyclerView.OnScrollListener {

    private int visibleThreshold = 2;
    private int currentPage = 1;
    private int previousTotalItemCount = 0;
    private boolean loading = true;
    private RecyclerView.LayoutManager mLayoutManager;
    // it can LinearLayoutManager as well
    public EndlessScrollListener(GridLayoutManager layoutManager) {
        this.mLayoutManager = layoutManager;
        visibleThreshold = visibleThreshold * layoutManager.getSpanCount();
    }

    @Override
    public void onScrolled(RecyclerView view, int dx, int dy) {
        int totalItemCount = mLayoutManager.getItemCount();
        int lastVisibleItemPosition = ((GridLayoutManager) mLayoutManager).findLastVisibleItemPosition();

        if (loading && (totalItemCount > previousTotalItemCount)) {
            loading = false;
            previousTotalItemCount = totalItemCount;
        }

        if (!loading && (lastVisibleItemPosition + visibleThreshold) > totalItemCount) {
            currentPage++;
            onLoadMore(currentPage, totalItemCount, view);
            loading = true;
        }
    }

    public abstract void onLoadMore(int page, int totalItemsCount, RecyclerView view);

}

В классе фрагментов

private void observeEndlessScrolling() {
        scrollListener = new EndlessScrollListener(layoutManager) {
            @Override
            public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {

                    viewModel.fetchMoreData(page);
                } 
            }
        };
       recyclerView.addOnScrollListener(scrollListener);
    }

https://github.com/droiddevgeeks/ImageSearch/blob/master/app/src/main/java/com/example/imagesearch/ui/MainActivity.java

https://github.com/droiddevgeeks/ImageSearch/blob/master/app/src/main/java/com/example/imagesearch/util/EndlessScrollListener.java

...