2016-06-18 5 views
6

初めて私はonscroll listenerを使用しています。私の問題は、スクロールするたびに20個の新しい行をフェッチする方法です。setOnScrollListenerを使用してサーバから20行しか取り出しません

グリッドビューをスクロールダウンすると、このコードが実行されます。

public void onScroll(AbsListView view, int firstVisibleItem, 
          int visibleItemCount, int totalItemCount) { 
      // TODO Auto-generated method stub 

      this.currentFirstVisibleItem = firstVisibleItem; 
      this.currentVisibleItemCount = visibleItemCount; 
      this.totalItem = totalItemCount; 

      if ((totalItemCount - visibleItemCount) <= (firstVisibleItem + 20)) { 
       // the below when executed will get all the rows ,I only need 20 rows 
      handler.execute().get(); 

      } 
     } 

この接続はあなたがデータロードのためbaselimitを維持する必要が

protected void showList(){ 
     try { 

      JSONObject jsonObj = new JSONObject(myJSON); 
      peoples = jsonObj.getJSONArray("result"); 
      System.out.println("Length:"+peoples.length()); 
      int J_length=peoples.length()-1; 


      jsonObj= peoples.getJSONObject(J_length); 


       Listitem = new ArrayList<Listitem>(); 

       for (int i = 0; i < peoples.length(); i++) { 
        JSONObject c = peoples.getJSONObject(i); 

        String id = c.getString("id"); 
        String url = c.getString("url"); 

        int intid = 0; 
        try { 
         intid = Integer.parseInt(id.toString()); 
        } catch (NumberFormatException nfe) { 
         System.out.println("Could not parse " + nfe); 
        } 

        Listitem.add(new Listitem(id, url)); 
        System.out.println(Listitem); 
       } 
      //} 
      if (mListener != null) 
        mListener.myMethod(Listitem); 


     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 
+0

スクロールリスナーの代わりにアダプタを使用していない理由を教えてください。私はアダプターをお勧めします。なぜなら、この問題は非常に簡単に解決でき、より良い経験を得るからです。 – Neo

+0

アダプターでの使用方法の例を教えてください。 – Moudiz

+0

アダプタの助けを借りて同様の問題解決のために私の作業コードを掲載しました。それはあなたを助けてくれることを願っています:) – Neo

答えて

3

は親切にご利用ごとに変更し、作業コードです - あなたは一つのインタフェース必要

public class MyModel { 
    String name; 
} 

- -

以下と仮定しましょう、あなたのモデルである

public interface PagingListener<T> { 
    void onItemUpdate(ArrayList<T> allData); 
} 

をごアダプタを設計このように -

public class CouponsAdapter extends RecyclerView.Adapter<CouponsAdapter.CouponHolder> implements View.OnClickListener, PagingListener<MyModel> { 
    private final static int TYPE_LOADING = 0; 
    private final static int TYPE_DATA = 1; 
    private FragmentActivity activity; 
    private LayoutInflater inflater; 
    private PagingRequestHandler<MyModel> pagingRequestHandler; 
    private ArrayList<MyModel> data = null; 

    public CouponsAdapter(FragmentActivity activity) { 
     this.activity = activity; 
     inflater = LayoutInflater.from(activity); 
     this.data = new ArrayList<>(); 
     this.pagingRequestHandler = new PagingRequestHandler<>(data, this); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return position >= data.size() ? TYPE_LOADING : TYPE_DATA; 
    } 

    @Override 
    public CouponHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view; 
     if (viewType == TYPE_DATA) { 
      view = inflater.inflate(R.layout.item_coupons_card_block, parent, false); 
     } else { 
      view = inflater.inflate(R.layout.item_drawer_payment_loading, parent, false); 
     } 
     return new CouponHolder(view, viewType); 
    } 

    @Override 
    public void onBindViewHolder(CouponHolder holder, int position) { 
     if (getItemViewType(position) == TYPE_DATA) { 
      //Bind your view here 
     } 
     pagingRequestHandler.checkAndMakeRequestForMoreData(position); //Will check and make request 
    } 

    @Override 
    public int getItemCount() { 
     return data.size() + (pagingRequestHandler.isNoMoreDataLeft() ? 0 : 1); // If no data then it will return 1 to show loading 
    } 

    @Override 
    public void onClick(View v) { 
    } 

    @Override 
    public void onItemUpdate(ArrayList<MyModel> allData) { 
     this.data = allData; // will update data with updated content 
     notifyDataSetChanged(); 

    } 


    public class CouponHolder extends RecyclerView.ViewHolder { 
     public CouponHolder(View itemView, int itemType) { 
      super(itemView); 
      if (itemType == TYPE_DATA) { 
      } 
     } 
    } 
} 

そして今、これはページ番号を追跡しますと次のページのリクエストを行いますページング要求ハンドラ、ある -

public class PagingRequestHandler<T> { 
    public static final int PAGE_SIZE = 10; 
    private final PagingListener listener; 
    private final ArrayList<MyModel> arrayList; 
    private final String url = "Your Url here"; 
    private boolean noMoreDataLeft; 
    private int pagingIndex = 0; 
    private boolean requestGoingOn; 


    public PagingRequestHandler(ArrayList<MyModel> data, PagingListener<MyModel> listener) { 
     this.listener = listener; 
     this.arrayList = data; 
     fetchMoreData(); 

    } 

    private void fetchMoreData() { 
     requestGoingOn = true; 
     Call<MyModel[]> getCoupons = Utils.getRetrofit().getCoupons(url + "/" + pagingIndex); // I am using retrofit for network call, you can use your own 
     getCoupons.enqueue(new Callback<MyModel[]>() { 
      @Override 
      public void onResponse(Response<MyModel[]> response, Retrofit retrofit) { 
       try { 
        requestGoingOn = false; 
        MyModel[] couponModelDses = response.body(); 
        if (couponModelDses != null) { 
         for (MyModel couponModelDse : couponModelDses) { 
          arrayList.add(couponModelDse); 
         } 
         if (couponModelDses.length < PAGE_SIZE) 
          noMoreDataLeft = true; 
         listener.onItemUpdate(arrayList); 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 

       } 
      } 

      @Override 
      public void onFailure(Throwable t) { 
       requestGoingOn = false; 
      } 
     }); 
    } 

    public boolean isNoMoreDataLeft() { 
     return noMoreDataLeft; 
    } 

    public void checkAndMakeRequestForMoreData(int position) { 
     if (!noMoreDataLeft && !requestGoingOn && position > (PAGE_SIZE * pagingIndex)) { 
      if ((position % PAGE_SIZE) > (int) (PAGE_SIZE * .7)) { 
       pagingIndex++; 
       fetchMoreData(); 
      } 
     } 
    } 
} 
仕組み

- アダプタがネットワーク呼び出しを行うハンドラを、初期化され初めて。アダプタは、ハンドラapiを呼び出して、onBindごとにページの70%がスクロールされているかどうかを確認します。データの70%が表示されたら、ネットワークコールを再実行し、requestGoingOnという変数をtrueにすると、リストにローダーを表示できます。 Wherの要求が完了したハンドラは、コールバックonItemUpdateを呼び出して、arraylistにデータを追加してアダプタを更新しています。

さらなる支援が必要な場合は、私にお知らせください。

+0

私はそれを見ていただきありがとうございます – Moudiz

+0

@Moudizはあなたの問題解決ですか? – Neo

+0

まだまだ私は最近忙しかった、tomorow私はあなたに感謝それを確認します – Moudiz

5

を起こるところこれは私のコード

// the load more in the grid view, fetch new images. 
mGridView.setOnScrollListener(new AbsListView.OnScrollListener() { 
    private int currentVisibleItemCount; 
    private int currentScrollState; 
    private int currentFirstVisibleItem; 
    private int totalItem; 
    private LinearLayout lBelow; 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     // TODO Auto-generated method stub 
     this.currentScrollState = scrollState; 
     this.isScrollCompleted(); 
    } 

    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
         int visibleItemCount, int totalItemCount) { 
     // TODO Auto-generated method stub 

     this.currentFirstVisibleItem = firstVisibleItem; 
     this.currentVisibleItemCount = visibleItemCount; 
     this.totalItem = totalItemCount; 

     if ((totalItemCount - visibleItemCount) <= (firstVisibleItem + 20)) { 
      // load new 20 row but how to do that 

     } 
    } 

    private void isScrollCompleted() { 
     if (totalItem - currentFirstVisibleItem == currentVisibleItemCount 
       && this.currentScrollState == SCROLL_STATE_IDLE) { 
      Log.d("a", "poooppii"); 

     } 
    } 

    ; 
}); 

です。ベースとリミット変数を初期化します。

新しい項目を読み込むたびに、base変数を増やしてください。あなたのAPI呼び出しで

base = base + limit; 
handler.execute().get(); 

baselimit変数、あなたはAPI側からのクエリでそれを使用できるように。

注:baseは、値の取得を開始する必要がある位置の値です。 limitは、フェッチする必要がある行の数です。

sqliteの制限クエリについてはthisを参照してください。
MySqlの制限クエリについては、thisを参照してください。
SQLの制限クエリについては、thisを参照してください。ここで

+1

あなたは限界と塩基が足りなくなっていました。 setOnScrollListenerは、リサイクラービュー用に指定されていません。 Web上での例題の悪い検索あなたはrecyclerviewとスクロールの読み込みのためのrecomandedの例がありますか? – Moudiz

+0

[this](http://stackoverflow.com/a/26643292/3134215) –

関連する問題