如何在每次到达RecyclerView结束时获取20个项目,并确保它与上一个项目不同?

时间:2017-03-16 06:45:40

标签: php android android-recyclerview

我有一个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请求来获取数据?

0 个答案:

没有答案