[英]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.