0

我正在創建一個新的android應用程序,我已經接近完成了第一個屏幕。但是,一旦我到達屏幕底部,就不會加載新數據,該應用會將我引導至頁面的開頭。Android:我如何在回收站中加載更多數據在後臺查看

我正在使用的API將在發送第二頁請求時發送下一頁。您能告訴我如何製作應用程序,以便在用戶到達第一頁的末尾之前,它自動發送第二頁的請求。

我使用volley library以及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); 
} 
+0

我的解決方案對您有幫助嗎? –

回答

1

請參閱this。它在這裏以一種很酷的方式解釋。

基本上,你需要一個onScrollChangeListener來檢測回收站查看滾動更改,但單獨不會幫助。因此,您需要一種方法來檢查您目前是否達到回收站視圖的底部。所以這裏是你如何做到這一點:

入住這條線在上面的鏈接

// 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) 

解釋爲 - >如果(真& &(0 + 6 + 0)> = 10),其解釋爲假!

因此第二個呼叫現在不會進行。當您的最後一項是第10項時(因爲您的閾值爲0)

但現在如果您添加閾值4,則會在滿足現在條件時進行下一個呼叫: 將解釋爲 - > if (true & &(0 + 6 + 4)> = 10),其解釋爲正確!

總結,visibleThreshold是你添加邏輯的地方,你可以從鏈接中實現鍋爐板代碼!

1

對於分頁我用下面的代碼

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()

+0

我不明白'hasMoreRequest'和'startAPI'在結尾處有什麼用處,Android Studio也在這些行上顯示錯誤。 –

+0

@Priyansh Bhatt對不起,我直到今天才看到這個評論。 'hasMoreRequest'是一個標誌,表示如果要開始下一頁下載或不啓動,請將類作爲'boolean hasMoreRequest;'開始變量。 'startAPI'是你自己調用服務器獲取下一頁數據的函數。 –

相關問題