【问题标题】:How to implement pagination in recyclerview?如何在recyclerview中实现分页?
【发布时间】:2018-07-27 13:18:09
【问题描述】:

我正在 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


    【解决方案1】:

    试试下面的代码

    // 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();
    
                                }
                            }
    
                        }
                    }
                });
    

    【讨论】:

    • 代码很好理解,这里加载了什么?
    • Loading 是检查 api 或数据当前是否正在记录的标志。
    【解决方案2】:

    在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);
    

    希望这会有所帮助。

    【讨论】:

    • 先生,这是个问题,我如何将下一页号码发送到服务器端
    • 我上面也提到了我的getPagination方法。在这里“http://xyz/AppApi/ViewAllLatestProducts?UserName=wkappserviceuser&Password=q3j5tw4gtw6z2n92&Page=1”
    【解决方案3】:

    在滚动结束时调用下一页。

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

    RecyclerView 的更多解释

    How to implement pagination in RecyclerView on scroll

    演示项目

    Github Link

    【讨论】:

      猜你喜欢
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 2021-12-05
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多