我有一个RecyclerView,我希望它是无限滚动,所以每当我到达最后5项时,它再次向服务器发出请求。这部分到目前为止没问题,它可以检测到RecyclerView中的最后5项并制作排球再次请求。
现在的主要问题是,第二次请求的数据(到达最后5项时发出的请求)是第一次发送的数据。
因此,我想要的是,在第一个请求(用户刚刚启动活动)请求获取20个帖子并显示它,当到达最后5个项目时,再次请求20个帖子,这与第一个20个帖子不同。
到目前为止我尝试的是
设置偏移量
// initially offset will be 0, later will be updated while parsing the json
private int offSet = 0;
使用在第一次请求时获取的ID
更新偏移量// updating offset value to highest value
if (id >= offSet)
offSet = id;
以排名方式将offset
值发送到php服务器(第一次请求的同一个截击请求)
@Override
protected Map<String, String> getParams() {
// Posting params to endpoint
Map<String, String> params = new HashMap<>();
params.put("offset", String.valueOf(offSet));
return params;
}
所以在我的PHP代码中,我这样处理
$offsetString =$app->request()->get('offset');
$offset =(int) $offsetString;
$limit=20;
//loop though result and get the 20 post each time
for ($j = $offset; $j < $offset + $limit && $j < sizeof($item = $result->fetch_assoc()); $j++) {
$tmp = array();
$tmp['post_id'] = $item['item_id'][$j];
$tmp['username'] = $item['username'][$j];
$tmp['profile_image_path'] = $item['profile_image_path'][$j];
$tmp['status_body'] = $item['status_body'][$j];
$tmp['image_path'] = $item['image_path'][$j];
$tmp['post_created_at'] = $item['created_at'][$j];
array_push($response['item'], $tmp);
}
但最终我的Json变得像这样奇怪,与我之前的Json完全不同的JSON。
{"feed":[{"item_id":null,"username":"k","profile_image_path":"h","status_body":"I","image_path":"h","created_at":"2"},{"item_id":null,"username":"e","profile_image_path":"t","status_body":"h","image_path":"t","created_at":"0"},
此时,一旦到达RecyclerView中的最后5项,我就会使用相同的功能来发出请求。看起来像这样:
//for endless scroll
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
visibleItemCount = recyclerView.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && (totalItemCount - visibleItemCount)
<= (firstVisibleItem + visibleThreshold)) {
// End has been reached
Log.i("Yaeye!", "end called");
//This is Volley request to fetch data from Server
//should I make another volley request that different with the 1st request
fetchPost();
loading = true;
}
}
});
所以,我需要知道我错过了什么,或者解决这个问题的正确方法?
最重要的是,我应该在php部分做什么?
或者我应该制作2个单独的Volley请求来获取数据?