0

私は新しいアンドロイドアプリを作成しています。私はほぼ最初の画面を完成させました。しかし、画面の下部に達するとすぐに、新しいデータを読み込むのではなく、ページの先頭にアプリが自動的にスローされます。Android:recyclerViewのバックグラウンドでもっとデータを読み込むには

私が使用しているAPIは、2ページ目のリクエストを送信すると次のページを送信します。あなたは、ユーザーが最初のページの最後に達する前に自動的に2ページ目のリクエストを送信するようにアプリを作ることができますか教えてください。

私は、recyclerViewとcardViewと共にvolleyライブラリを使用しています。私はどこに変更を加えるべきかについて明確に説明していただけますか?私はアプリ開発の初心者です。ここで

がボレー要求されています。私が使用してページネーションのために

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を参照してください。ここでクールなファッションで説明されています。

基本的には、recyclerviewのスクロールの変更を検出するにはonScrollChangeListenerが必要ですが、それだけでは役に立たないでしょう。だから、あなたが現在あなたの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); 
     } 

には、変更して、2番目の呼び出しを行うためにカスタム値を所有して適用するところである変数visibleThresholdを参照してください。

値であることを確認することができます:

visibleThresholdが0であり、あなたが10の6項目のリストとyou`re内の項目と最初の項目は、0番目の項目であるとします。 このライン

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

は、偽と解釈する - > if(true & &(0 + 6 + 0)> = 10)と解釈します。

したがって、2番目の呼び出しは今行われません。最後の項目が10番目の項目(しきい値が0のため)のときに作成されます

しかし、しきい値4を追加すると、次の呼び出しが現在の条件を満たすようになります。 は - > if (true & &(0 + 6 + 4)> = 10)trueと解釈されます。

要約すると、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'はサーバを呼び出して次のページのデータを取得する独自の関数です。 –

関連する問題