2017-02-13 3 views
-1

Ich weiß, es gibt viele Fragen zum gleichen Problem, aber ich bin nicht in der Lage, mein Problem zu finden. Wenn ich URL in meiner HttpRequest-Klasse drucke, wird zwar die richtige URL angezeigt, aber immer noch dieselben Daten.RecyclerView Endless Scroll

recyclerView.addOnScrollListener(new asd(manager ) { 
       boolean loading = false; 
       int scrollIndex = 1; 
       @Override 
       public void onScrolledToEnd() { 

        if(!loading){ 
         loading = true; 
         try { 
          scrollIndex = scrollIndex+10; 
          String url = "https // xyz com?q=" + query + "&scrollIndex="+ scrollIndex + "&key=" + getResources().getString(R.string.api_key); 
          new HttpRequest(url,SearchActivity.this).execute(); 
          adapter.notifyItemRangeChanged(list.size(),10); 
          adapter.notifyDataSetChanged(); 
         } catch (MalformedURLException e) { 
          e.printStackTrace(); 
         } 

        } 
        loading = false; 
       } 
      }); 

Hier ist OnScrollListener

public abstract class asd extends RecyclerView.OnScrollListener { 


    public static String TAG = asd.class.getSimpleName(); 

    // use your LayoutManager instead 
    private LinearLayoutManager llm; 

    public asd(LinearLayoutManager sglm) { 
     this.llm = sglm; 
    } 

    @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     super.onScrolled(recyclerView, dx, dy); 

     if (!recyclerView.canScrollVertically(1)) { 
      onScrolledToEnd(); 
     } 
    } 

    public abstract void onScrolledToEnd(); 
} 

Antwort

0

ich diese verwenden und es funktioniert, vielleicht muss man mit Werten um ein wenig spielen Ihrem speziellen Fall zu passen. Aber ich hoffe, es hilft:

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
    @Override 
    public void onScrollStateChanged(RecyclerView recyclerView, 
            int newState) { 
     super.onScrollStateChanged(recyclerView, newState); 
    } 

    @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     super.onScrolled(recyclerView, dx, dy); 
     LinearLayoutManager linearLayoutManager = ((LinearLayoutManager)mRecyclerView.getLayoutManager()); 
     int visibleItemCount = linearLayoutManager.getChildCount(); 
     int totalItemCount = linearLayoutManager.getItemCount(); 
     int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition(); 

     //Log.d(TAG,"Visible="+visibleItemCount+", total="+totalItemCount+", first="+firstVisibleItemPosition); 

     if ((visibleItemCount + firstVisibleItemPosition) >= totalItemCount 
       && firstVisibleItemPosition >= 0 
       && totalItemCount >= pageSize) { 
      //Log.d(TAG,"Entrato, lancio"); 
      loadMoreItems(); 
     } 
    } 
}); 

Hier pageSize ist die Anzahl der Elemente, die ich jedes Mal bin Laden; Die Methode loadMoreItems() ist dafür verantwortlich, die Daten aus dem Internet abzurufen und den Adapter zu benachrichtigen.

+0

Wie kann ich durch api Paginieren? ist meine Implementierung von loadMoreItems() korrekt? – user6556461

+0

Das liegt an Ihnen, ich weiß nicht, wie Ihre API funktioniert –

+0

Es erfordert StartIndex in URL, aus dem ich paginate alle 10 Elemente und inkrementiere StartIndex um 10, Problem ist mit Ihrem Code mein StartIndex um 10 nur einmal und Elemente hinzugefügt werden immer von der vorherigen URL – user6556461

0

Verwenden Sie dies.

LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
     mRecyclerView.setLayoutManager(mLayoutManager); 
     mRecyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(mLayoutManager,maxCount) { 
      @Override 
      public void onLoadMore(int current_page) { 
       /// onLoadMore(current_page); 
       loadmoreContacts(current_page); 
       Log.e("onLoadMore ", "" + current_page); 
      } 
     }); 

neue Klasse erstellen

public abstract class EndlessRecyclerOnScrollListener extends 
    RecyclerView.OnScrollListener { 
public static String TAG = EndlessRecyclerOnScrollListener.class 
     .getSimpleName(); 
int maxCount; 
private int previousTotal = 0; 
private boolean loading = true; 
private int visibleThreshold = 5; 
int firstVisibleItem, visibleItemCount, totalItemCount; 

private int current_page = 1; 

private LinearLayoutManager mLinearLayoutManager; 

public EndlessRecyclerOnScrollListener(
     LinearLayoutManager linearLayoutManager,int maxCount) { 
    this.mLinearLayoutManager = linearLayoutManager; 
    this.maxCount = maxCount; 
} 

@Override 
public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
    super.onScrolled(recyclerView, dx, dy); 

    visibleItemCount = recyclerView.getChildCount(); 
    totalItemCount = mLinearLayoutManager.getItemCount(); 
    firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition(); 

    if (loading) { 
     if (totalItemCount > previousTotal) { 
      loading = false; 
      previousTotal = totalItemCount; 
     } 
    } 

    if(totalItemCount>=maxCount){ 
     loading=false; 
     return; 
    } 
    if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { 
     // End has been reached 

     // Do something 
     current_page++; 

     onLoadMore(current_page); 

     loading = true; 
    } 
} 
public abstract void onLoadMore(int current_page);} 
Verwandte Themen