2016-03-12 14 views
7

Ho circa 32 record in JSON, sto usando RecyclerView per mostrare loro e ho implementato OnScrollListener (...)RecyclerView OnScrollListener() Edizione

Domanda

ho iniziato un'attività, ho recuperato tutto 32 record, ora quando faccio scorrere, perché sto ancora ricevendo lo stesso 32 record ancora e ancora, ogni volta che faccio scorrere, ecco la mia implementazione di OnScrollListener()

public void initializeOnScrollForRecyclerView() { 
     mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 

       int visibleItemCount = recyclerView.getLayoutManager().getChildCount(); 
       int totalItemCount = recyclerView.getLayoutManager().getItemCount(); 
       int pastVisiblesItems = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition(); 

       if (!isLoading) { 
        if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) { 
         isLoading = true; 
         mPostPresenter.loadPosts(false); 
        } 
       } 
      } 
     }); 
    } 
+0

Cosa significa mPostPresenter.loadPosts (false) fanno? carica ancora json? –

+0

@RageshRamesh controllo ora ho postato più codice – Oreo

+0

Ho aggiunto una risposta per dare un'occhiata e vedere se risolve il problema. se non me lo fa sapere e indagherò ulteriormente. –

risposta

5

L'attuazione sembra essere corretta, ma per una condizione che fallisce, prova quando dy> 0 piace questo (anche p ut questo nel OnCreate del Attività):

private boolean loading = true; 

recyclerView.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) 
     { 

      if (loading) { 
       if (dy > 0) //check for scroll down 
       { 
        visibleItemCount = layoutManager.getChildCount(); 
        totalItemCount = layoutManager.getItemCount(); 
        pastVisiblesItems = layoutManager.findFirstVisibleItemPosition(); 

        if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) { 
         loading = false; 

         Log.v("...", " Reached Last Item"); 
         loadMoreVideos(searchVideos); 
        } 

       } 
      } 
     } 
    }); 
+0

grazie :) la tua soluzione ha funzionato per me, ma non ho capito cosa significa dy e dx? – Oreo

+1

dx - La quantità di scorrimento orizzontale. dy - La quantità di scorrimento verticale. –

+0

@VeereshCharantimath - Ciao. Ho bisogno della stessa cosa per la visualizzazione orizzontale del riciclo. Vuoi chiamare il servizio web sull'ultimo oggetto visibile. Ma non sono in grado di farlo. Puoi guidarmi per favore. –

0

Si utilizza questo

if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) 

Il che significa che una volta che avete visto 22 record che si sta caricando di nuovo. E durante il caricamento di nuovo stai ricevendo gli stessi dati e aggiungendolo alla tua lista.

Vedo che stai usando RXjava. Quando ti iscrivi a loadPost, controlla quali dati stai osservando sta emettendo. penso che emetta nuovamente gli stessi dati i tuoi 32 record e quei record vengono aggiunti di nuovo e questo è un ciclo infinito.

+0

quindi dove devo apportare modifiche nel mio codice? – Oreo

+0

Se non si utilizza la pagenazione, è sufficiente rimuovere il blocco del listener di onscroll. Se si utilizza la pagenazione, il problema riguarda il blocco mApi.getPosts(). Se il tuo server ha utilizzato la paginazione, dovrai inviare un numero di pagina nella richiesta. –

+0

rimuovi Listener onscroll per ora. Una volta implementata la paginazione, puoi tornare a questo. –

0

Ecco un altro modo per far scattare qualcosa quando ultimo elemento viene raggiunto

@Override 
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { 

    //When last item is reached 
    if(position == yourList.size() - 1){ 
     loadMoreMessages(); 
    } 
    } 

public abstract void loadMoreMessages();