2014-07-17 14 views
5

Ich habe ein Swipe-Refresh-Layout für meine Rasteransicht implementiert und es funktioniert perfekt, wenn ich nach unten ziehe (scroll), damit die Aktualisierung aufgerufen wird.Android Swipe Aktualisieren Layout nach oben scrollen, um zu aktualisieren

Ich versuche jedoch herauszufinden, wie aktualisiert wird, wenn der Benutzer nach oben scrollt. Wenn der Benutzer also das letzte der Elemente im Raster erreicht (mein Limit ist 10), wenn der Benutzer alle zehn sieht und dann nach oben zieht oder versucht, weiter zu scrollen, wie kann ich dann aktualisieren?

Jede Hilfe wird geschätzt.

Antwort

5

so Leute entweder a: wissen nicht die Antwort auf diese Frage oder b: sie sind nicht bereit, das Wissen zu teilen.

Jedenfalls habe ich nach langer Zeit meine eigene Lösung gefunden. Ich habe mein Gitter einen Scroll-Listener, und berechnet, wenn I auf den unteren Rand des Bildschirms gescrollt, an dieser Stelle mich die OnRefresh() Methode von dem Swipe erinnern aufzuzufrischen ...

EDIT weiter Infos

So fügen, nachdem er tat etwas Forschung zu berechnen, wenn der Benutzer den Boden einer Rasteransicht erreichte ich Fragen wie this und andere folgte, dass zu bekommen. Unten ist mein Code, den ich ändern musste, damit er mit der nativen Auffrischungsfunktion funktioniert. Meine Änderungen sollten eine ständige Erfrischung verhindern. In meiner if-Anweisung ist also ein Häkchen, dass es momentan nicht aktualisiert wird. Als ich unten angekommen bin, wurde es aktualisiert, aber ich hatte diese Überprüfung nicht, so dass es ständig aktualisiert wurde. Ich musste dann die Gesamtzahl der Elemente in meinem Grid überprüfen, denn als der Benutzer den letzten Punkt (den allerletzten Punkt) erreichte, war die App auch erfrischend und es gab nichts, was den Zyklus unterbrechen konnte. Hoffentlich ist dies eine Hilfe ...

 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, ich dieses Verhalten gerade versucht zu replizieren und Probleme habe. Ich benutzen http://nlopez.io/swiperefreshlayout-with-listview-done-right/ die frühen erfrischend auf meinem gridview zu beheben, aber ich habe Probleme bei der Berechnung, wo die Unterseite meiner Liste. Könnten Sie Ihre Antwort mit der Berechnung des Bodens bearbeiten? Vielen Dank! –

3

Sie versuchen, auf diese Weise

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

meine Antwort Siehe in stackoverflow

SwipeRefreshLayout von Android Support Library Version 21 nicht ziehen von unten unterstützen. Ich habe die Änderung SwipeRefreshLayoutBottom vorgenommen, die auf dem ursprünglichen SwipeRefreshLayout-Code basiert. Es basiert vollständig auf Original-Google-Code mit nur Inversion von Koordinaten und neu geschriebenen canChildScrollDown-Methode. Alle Änderungen sind als TODO gekennzeichnet.

Bitbucker repository

2

Eine andere Antwort, wenn jemand noch interessiert ist. Um beim Scrollen nach unten zu aktualisieren, habe ich onRefreshListerner() auf swipeRefreshLayout implementiert.

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); 
     } 
    }); 

Aber um zu aktualisieren, wenn nach oben scrollen und nur, wenn ich an das Ende der Liste habe, habe ich OnTouchListener() auf der Liste implementiert, die die swipeRefreshLayout enthält.setRefreshing (true), um die Wirkung zu starten:

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; 
     } 
    }); 

Natürlich müssen Sie die swipeRefreshLayout deaktivieren, nachdem die Liste zu aktualisieren:

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

ich diese Antwort verwendet habe, zu wissen, wann ich habe das Ende der Liste:

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

Verwandte Themen