2014-07-17 8 views
5

Ho implementato un layout di aggiornamento swipe per la mia visualizzazione griglia e funziona perfettamente se sposto (scorri) verso il basso per chiamare l'aggiornamento.Layout di aggiornamento swipe Android scorrere verso l'alto per aggiornare

Tuttavia, sto cercando di capire come aggiornare quando l'utente scorre verso l'alto. Quindi, quando l'utente raggiunge l'ultimo degli elementi nella griglia (il mio limite è 10), quindi quando l'utente vede tutti e dieci e poi tira verso l'alto o prova a continuare a scorrere come posso quindi aggiornare?

Qualsiasi aiuto è apprezzato.

risposta

5

quindi le persone o: non conoscono la risposta a questa domanda o b: non sono disposti a condividere la conoscenza.

In ogni caso, dopo tanto tempo, ho trovato la mia soluzione. Ho aggiunto un ascoltatore di scorrimento per la mia griglia e calcolato quando ho scorrere verso il basso dello schermo, a questo punto mi ricordo il metodo onRefresh() dal colpo per rinfrescare ...

EDIT per aggiungere ulteriori informazioni

Così, dopo ho fatto qualche ricerca per calcolare quando l'utente ha raggiunto il fondo di una visualizzazione a griglia che ho seguito a domande come this e altri per ottenere questo. Di seguito è riportato il mio codice che ho dovuto modificare per far funzionare la funzionalità di aggiornamento nativa. Le mie alterazioni erano di impedire il costante aggiornamento. Così incluso nella mia istruzione if è un controllo che non è attualmente in fase di aggiornamento, quindi quando ho raggiunto il fondo è stato aggiornato, ma non ho avuto tale controllo in modo che venga costantemente aggiornato. Ho quindi dovuto fare un controllo sulla quantità totale di articoli nella mia griglia, poiché quando l'utente ha raggiunto l'ultimo elemento (ultimo elemento) l'app ha continuato a rinfrescare e non c'era nulla da rompere il ciclo. Speriamo che questo sia di qualche aiuto ...

 worldBeersGrid.setOnScrollListener(new AbsListView.OnScrollListener() { 
     @Override 
     public void onScrollStateChanged(AbsListView absListView, int i) { 

     } 
     @Override 
     public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

      int position = firstVisibleItem+visibleItemCount; 
      int limit = totalItemCount; 
      int totalItems = sharedpreferences.getInt("WORLD ITEM COUNT", 0); 

      Log.i("TOTAL WORLD ITEMS", String.valueOf(totalItems)); 
      Log.i("LIMIT :::::::::::: ", String.valueOf(limit)); 
      Log.i("POSITION ::::::::::::", String.valueOf(position)); 
      Log.i("REFRESHING :::::::::::::::", String.valueOf(swipeRefreshLayout.isRefreshing())); 

      if(position>=limit && totalItemCount>0 && !swipeRefreshLayout.isRefreshing() && position <totalItems){ 
       swipeRefreshLayout.setRefreshing(true); 
       //In the below method I made my call to my ws... 
       onRefresh(); 
      } 
     } 
    }); 
+1

Hey @ DJ-DOO, ho appena provato replicare questo comportamento e sto avendo difficoltà. Ho usato http://nlopez.io/swiperefreshlayout-with-listview-done-right/ per correggere i primi aggiornamenti sul mio gridview, ma non riesco a calcolare dove si trova il fondo della mia lista. Potresti modificare la tua risposta con come hai calcolato il fondo? Grazie! –

3

Si tenta in questo modo

listView.setOnScrollListener(new OnScrollListener() { 

@Override 
public void onScrollStateChanged(AbsListView view, int scrollState) { 
} 

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, 
     int visibleItemCount, int totalItemCount) { 
    boolean enable = false; 
    if(listView != null && listView.getChildCount() > 0){ 
     // check if the first item of the list is visible 
     boolean firstItemVisible = listView.getFirstVisiblePosition() == 0; 
     // check if the top of the first item is visible 
     boolean topOfFirstItemVisible = listView.getChildAt(0).getTop() == 0; 
     // enabling or disabling the refresh layout 
     enable = firstItemVisible && topOfFirstItemVisible; 
    } 
    swipeRefreshLayout.setEnabled(enable); 
}}); 
5

Vedere la mia risposta in stackoverflow

SwipeRefreshLayout dalla libreria di supporto di Android versione 21 non supporta tiro dal basso. Ho apportato modifiche SwipeRefreshLayoutBottom basato sul codice SwipeRefreshLayout originale. Si basa completamente sul codice originale di Google con la semplice inversione delle coordinate e il metodo canChildScrollDown appena scritto. Tutte le modifiche sono contrassegnate come TODO.

Bitbucker repository

2

Un'altra risposta se qualcuno è ancora interessato. Per aggiornare quando scorri verso il basso, ho implementato onRefreshListerner() su swipeRefreshLayout.

swipeRefreshLayout = (SwipeRefreshLayout) getView().findViewById(R.id.swipe_messages); 
    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
      swipeRefreshLayout.setRefreshing(true); 

      (new Handler()).postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        refresh(); 
       } 
      }, 1000); 
     } 
    }); 

Ma al fine di aggiornare quando si scorre su e solo quando li ho alla fine della lista, ho implementato OnTouchListener() nella lista che comprende la swipeRefreshLayout.setRefreshing (vero) per avviare l'effetto:

listView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == android.view.MotionEvent.ACTION_UP) { 

       if (listView.getLastVisiblePosition() == listView.getAdapter().getCount() -1 && 
         listView.getChildAt(listView.getChildCount() - 1).getBottom() <= listView.getHeight()) 
       { 

        swipeRefreshLayout.setRefreshing(true); 

        (new Handler()).postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          refresh(); 
         } 
        }, 1000); 

       } 
      } 
      return false; 
     } 
    }); 

Naturalmente è necessario disattivare lo swipeRefreshLayout dopo l'aggiornamento l'elenco:

public void refresh(){ 
    //Do something neat here to refresh your list 
    swipeRefreshLayout.setRefreshing(false); 
} 

Ho usato questa risposta per sapere quando ho avuto modo di alla fine della lista:

https://stackoverflow.com/a/10235887/6144027

Problemi correlati