如何在recyclerview中实现分页?

问题描述 投票:0回答:3

我正在recyclerView中执行分页。我的数据已成功加载,问题是如何向服务器请求下一页。我如何执行分页以及如何找到正在滚动的页码。

我的代码是:

rvLatestProduct.addOnScrollListener(new RecyclerView.OnScrollListener() {

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            //super.onScrolled(recyclerView, dx, dy);

            visibleItemCount = rvLatestProduct.getChildCount();
            totalItemCount = linearLayoutManager.getItemCount();
            firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
            Log.e("totalItemCount",String.valueOf(totalItemCount));
            if (loading) {
                if (totalItemCount > previousTotal) {
                    loading = false;
                   // currentPage += 1;
                    previousTotal = totalItemCount;
                    Log.e("previousTotal",String.valueOf(previousTotal));
                }
            }
            if (!loading && (totalItemCount - visibleItemCount)
                    <= (firstVisibleItem + visibleThreshold)) {
                //int initialSize = totalItemCount.size;
                getPagination();
                //val updatedSize = dataList.size
              //  recyclerView.post { adapter.notifyItemRangeInserted(initialSize, updatedSize) }
                loading = true;
            }
        }
    });

和 getPagination();代码如下

  private void getPagination(){
    final JsonArrayRequest request = new JsonArrayRequest(Request.Method.GET,
            AllURLs.viewAllLatestProduct,null,
            new Response.Listener<JSONArray>() {
                JSONArray object;
                @Override
                public void onResponse(JSONArray response) {
                    try {
                        for (int i=0;i<response.length();i++) {
                          object = response.getJSONArray(i);
                        }
                        setLatestProductAdapter(object);
                        adapter.notifyDataSetChanged();
                       // Toast.makeText(context,"page no" + pageNo,Toast.LENGTH_SHORT).show();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
    VolleySingleton.getInstance(context).addToRequestQueue(request);
}
android android-fragments android-recyclerview
3个回答
0
投票

尝试下面的代码

// Define variable in class 

private int page = 1, limit = 15;
private int firstVisibleItem, visibleItemCount, totalItemCount;
private int previousTotal = 0;
private int visibleThreshold = 10;

recyclerView滚动监听器代码:

recyclerView
                .addOnScrollListener(new RecyclerView.OnScrollListener() {

                @Override
                public void onScrollStateChanged(RecyclerView recyclerView,
                        int newState) {
                    super.onScrollStateChanged(recyclerView, newState);

                }

                @Override
                public void onScrolled(RecyclerView recyclerView, int dx,
                        int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    if (dy > 0) {
                        mLinearLayoutManager = (LinearLayoutManager) recyclerLikedItemsList
                                .getLayoutManager();

                        if (!CheckInternet
                                .checkInternetConnection(AllLikedItemList.this)) {
                            //show connection error


                        } else {

                            visibleItemCount = recyclerView.getChildCount();
                            totalItemCount = mLinearLayoutManager
                                    .getItemCount();
                            firstVisibleItem = mLinearLayoutManager
                                    .findFirstVisibleItemPosition();

                            if (loading) {
                                if (totalItemCount > previousTotal) {

                                    previousTotal = totalItemCount;
                                    page++;
                                }
                            }
                            if (!loading
                                    && (firstVisibleItem + visibleThreshold + visibleItemCount) >= totalItemCount) {
                                page++;
                                // call pagination and pass page limit
                                 getPagination();

                            }
                        }

                    }
                }
            });

0
投票

API url
中取一个
parameter
count
,每当调用
getPagination()
方法时,您都可以在
count
parameter
中发送增加的值。根据服务器端的
count
参数,您可以添加逻辑来获取下一个项目。

查看如何使用volley在Api中传递参数

StringRequest strreq = new StringRequest(Request.Method.POST,
     "http://196.1.1.1/myurl",
      new Response.Listener<String>() {
         @Override
         public void onResponse(String Response) {
                  // get response
         }
      }, new Response.ErrorListener() {
         @Override
         public void onErrorResponse(VolleyError e) {
            e.printStackTrace();
         }
}){@Override
    public Map<String, String> getParams(){
      Map<String, String> params = new HashMap<>();
      params.put("Count", count);
      return mParams;
 }
  }; 
Volley.getInstance(this).addToRequestQueue(strreq);

希望这会有所帮助。


0
投票

滚动结束时调用下一页。

您可以确定回收器视图何时滚动到最后一个元素。然后您可以发送下一页的请求。当下一页返回新结果时,将它们添加到上一个结果集中并更新列表。

使用 RecyclerView 进行更多说明

如何在RecyclerView中实现滚动分页

演示项目

Github链接

© www.soinside.com 2019 - 2024. All rights reserved.