如何通过api url索引实现recyclelerview的分页

时间:2017-11-22 07:50:33

标签: java android rest android-recyclerview pagination

我知道标题看起来很奇怪,但基本上我想要的是将分页应用到我的列表并使用url api端点作为参数来控制它。!

所以端点看起来像这样,例如> www.someapi.com/josn/list?pageIndex=1

它将给出一个包含10个项目的数组的响应,如果我想要更多,我必须将参数的索引更改为2,依此类推。!

响应

{
    "Succeeded": true,
    "AvailableChallenge": true,
    "DebugError": "",
    "NextPage": 2,
    "AllPages": 2,
    "Challenges": [
        {
            "ID": 114,
            "Title": "Amet sit id ratione dolorem numquam"
        },
        {
            "ID": 114,
            "Title": "Amet sit id ratione dolorem numquam"
        }
        ...
        ..
        .
        ]
 }

我捆绑了所有东西,但无法正确完成,我已经尝试了 here 中的大多数解决方案,但没有运气。 我还尝试使用这两个库 Paginate & recyclerview-paginated ,甚至 SuperRecyclerView 。但它没有用。!

任何有关控制此操作的最佳逻辑的帮助都会有很大帮助。

SuperRecyclerView的代码

public class ChallengesListFragment extends BaseFragment {

  private int pageNumber = 1; 
  private SuperRecyclerView recyclerview;
  private ArrayList<ChallengeActive> data;
  private ChallengesAdapter adapter;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_challenges_list, container, false);
    initView(rootView);
    initRecycler();
    getData(1);
    return rootView;
  }

 private void initRecycler() {
    data = new ArrayList<>();

    final RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
    recyclerview.setLayoutManager(mLayoutManager);
    adapter = new ChallengesAdapter(data, getActivity(), this); 
    recyclerview.setAdapter(adapter);

    recyclerview.setupMoreListener(new OnMoreListener() {
      @Override
      public void onMoreAsked(int overallItemsCount, int itemsBeforeMore, int maxLastVisiblePosition) {

        pageNumber++;
        getData(maxLastVisiblePosition);
      }
    }, 10);

    recyclerview.setRefreshListener(new OnRefreshListener() {
      @Override
      public void onRefresh() {
        pageNumber = 1;
        getData(pageNumber);
      }
    });

  }

  private void getData(final int pageNumber) {

      WebRequests.GetActiveChallenges(pageNumber, new onResult() {
      @Override
      public void onSuccess(Object object) {
        ArrayList<ChallengeActive> list = (ArrayList<ChallengeActive>) object;
        data.clear();
        data.addAll(list);
        adapter.notifyDataSetChanged();  
      }

      @Override
      public void onFail(Object object) {
        Toast.makeText(getActivity(), "Something went wrong, try again later",
            Toast.LENGTH_SHORT).show(); 
      }
    }); 
  } 
}  

2 个答案:

答案 0 :(得分:1)

以下是我在项目中的表现...在这种情况下,我会在列表底部添加更多元素

rv_flohtainer_events.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            if (!rv_flohtainer_events.canScrollVertically(1)){
                if (!(eventsResponse.getCurrent_page() == eventsResponse.getLast_page())) {
                    pageEventsRequest++;
                    makeVendorEventsRequest();
                }
            }
        }
    });

我所做的请求是改造,看起来像这样

@GET(RestClient.API_EVENTS_URL)
Call<EventsResponse> getEvents(@Query("page") int page)

答案 1 :(得分:1)

一段时间后,我使用 Paginate Library

进行了此操作

守则

public class ChallengesListFragment extends BaseFragment implements OnRefreshListener, Paginate.Callbacks { 

// other variables..
  private int currentPage = 1;
  private boolean hasMore;
  private boolean loadingInProgress;


  @RequiresApi(api = VERSION_CODES.LOLLIPOP)
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_challenges_list, container, false);
    initView(rootView);
    initToolbar();
    initRecycler();
    getData();

    return rootView;
  }

  private void initRecycler() {
    data = new ArrayList<>();
    mLayoutManager = new LinearLayoutManager(getActivity());
    recyclerview.setLayoutManager(mLayoutManager);
    adapter = new ChallengesAdapter(data, getActivity(), this);
    recyclerview.setAdapter(adapter);

    Paginate.with(recyclerview, this)
        .setLoadingTriggerThreshold(3)
        .addLoadingListItem(false)
        .build();
  }

  private void getData() {

     swipeRefresh.setRefreshing(true);
    WebRequests.GetActiveChallenges(currentPage, new onResult() {
      @Override
      public void onSuccess(Object object) {

        ArrayList<Challenge> list = (ArrayList<Challenge>) object;
        data.addAll(list);
        adapter.notifyDataSetChanged();

        if (list.size() == 10) {
          currentPage++;
          hasMore = true;
        } else {
          hasMore = false;
        }
        loadingInProgress = false;
        swipeRefresh.setRefreshing(false);


      }

      @Override
      public void onFail(Object object) {
        Toast.makeText(getActivity(), "Something went wrong, try again later",
            Toast.LENGTH_SHORT).show(); 
        swipeRefresh.setRefreshing(false);

      }
    });

  } 

  public ChallengesListFragment() {
   } 

  @Override
  public void onRefresh() {
    currentPage = 1;
    loadingInProgress = true;
    getData();
   }

  @Override
  public void onLoadMore() {
    loadingInProgress = true;
     Handler mHandler = new Handler();
    final Runnable hintRunnable = new Runnable() {
      @Override
      public void run() {
        getData();
      }
    };
    mHandler.postDelayed(hintRunnable, 1500);

  }

  @Override
  public boolean isLoading() {
    return loadingInProgress;
  }

  @Override
  public boolean hasLoadedAllItems() {
    return !hasMore;
  } 

}