繁体   English   中英

Android:如何在recyclerView中在后台加载更多数据

[英]Android: How can I load more data in the background in recyclerView

我正在创建一个新的android应用,我几乎已经完成了第一个屏幕。 但是,只要我到达屏幕底部,应用程序就会立即将我带到页面的开头,而不是加载新数据。

当我发送第二页的请求时,我正在使用的API将发送下一页。 您能告诉我如何制作应用程序,以便在用户到达第一页末尾之前自动发送第二页的请求。

我正在使用volley库以及recyclerView和cardView。 您能否清楚说明我应该在哪里进行更改,我是应用程序开发的新手。

这是截击要求:

private void discoverMovies() {

    final ProgressDialog progressDialog = new ProgressDialog(getContext());
    progressDialog.setMessage("Fetching Data From DB");
    progressDialog.show();

    //Requesting the data.....
    StringRequest stringRequest = new StringRequest(Request.Method.GET, tempURL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        progressDialog.dismiss();
                        JSONObject parentObject = new JSONObject(response);
                        JSONArray parentArray = parentObject.getJSONArray("results");

                        for (int i = 0; i < parentArray.length(); i++) {
                            JSONObject object = parentArray.getJSONObject(i);
                            movieModel model = new movieModel(
                                    object.getString("title"),
                                    object.getString("overview"),
                                    object.getString("release_date"),
                                    object.getString("poster_path"),
                                    object.getInt("id"),
                                    object.getBoolean("adult"),
                                    object.getInt("vote_count"),
                                    object.getDouble("vote_average"),
                                    object.getString("original_language"),
                                    object.getString("backdrop_path")
                            );

                            movieModels.add(model);
                            adapter = new cardViewAdapter(getContext(), movieModels);
                            recyclerView.setAdapter(adapter);
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    progressDialog.dismiss();
                    Toast.makeText(getActivity(), error.getLocalizedMessage(), Toast.LENGTH_LONG).show();
                }
            });

    RequestQueue requestQueue = Volley.newRequestQueue(getContext());
    requestQueue.add(stringRequest);
}

请参考 它以一种很酷的方式在这里解释。

基本上,您需要一个onScrollChangeListener来检测recyclerview中的滚动更改,但是仅此一项是无济于事的。 因此,您需要一种方法来检查您当前是否到达了recyclerview的底部。 因此,这是您的操作方式:

在上面的链接中检查此行

// If it isn't currently loading, we check to see if we have breached
        // the visibleThreshold and need to reload more data.
        // If we do need to reload some more data, we execute onLoadMore to fetch the data.
        if (!loading && (firstVisibleItem + visibleItemCount + visibleThreshold) >= totalItemCount ) {
            loading = onLoadMore(currentPage + 1, totalItemCount);
        }

请参阅变量visibleThreshold ,您可以在其中修改和应用自己的自定义值来进行第二次调用。

让我们用值来检查:

如果visibleThreshold为0,并且列表中有10个项目,而您位于第6个项目上,则第一个项目是第0个项目:此行

if (!loading && (firstVisibleItem + visibleItemCount + visibleThreshold) >= totalItemCount )

解释为-> if(true &&(0 + 6 + 0)> = 10)解释为false!

因此现在不会再打第二个电话了。 当您的lastitem是第十个项目时(因为您的阈值为0)

但是现在,如果您将阈值添加为4,则在满足条件的情况下进行下一个调用:解释为-> if(true &&(0 + 6 + 4)> = 10)解释为true!

总结一下,visibleThreshold是您添加逻辑的地方,其余的您可以从链接中实现样板代码!

对于分页,我使用以下代码

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (hasMoreRequest) {
                    if (dy > 0) { //check for scroll down
                        checkForMoreLoad();
                    }
                }
            }
        });

private void checkForMoreLoad() {
        final Handler handler = new Handler();
        Runnable checkForMoreData = new Runnable() {
            @Override
            public void run() {
                if (null != recyclerView) {
                    int visibleItemCount = recyclerView.getLayoutManager().getChildCount();
                    int totalItemCount = recyclerView.getLayoutManager().getItemCount();
                    int pastVisibleItems = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
                    onScrollToLoad(visibleItemCount, pastVisibleItems, totalItemCount);
                }
            }
        };
        handler.postDelayed(checkForMoreData, 100);
    }

    private void onScrollToLoad(int visibleItemCount, int pastVisibleItems, int totalItemCount) {
        if ((visibleItemCount + pastVisibleItems) >= totalItemCount && hasMoreRequest) {
            if (BuildConfig.DEBUG)
                Log.d(TAG, "onScroll lastInScreen - so load more");
            startApi(page + 1);
        }
    }

每当滚动到达滚动底部时,此代码将调用下一页的API。

同样在每个API之后,我再次调用checkForMoreLoad()方法以检查是否需要更多数据。 是的,别忘了在向适配器添加新元素后添加adapter.notifyItemRangeChanged()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM