485 Stimmen

Wie man Android Pull-to-Refresh implementiert

Wenn Sie in Android-Anwendungen wie Twitter (offizielle App) auf eine ListView stoßen, können Sie sie nach unten ziehen (und sie springt zurück, wenn sie losgelassen wird), um den Inhalt zu aktualisieren.

Ich frage mich, wie man das Ihrer Meinung nach am besten umsetzen kann?

Ich könnte mir einige Möglichkeiten vorstellen:

  1. Ein Element oben auf der ListView - aber ich glaube nicht, dass das Zurückblättern zu Elementposition 1 (0-basiert) mit Animation auf der ListView eine einfache Aufgabe ist.
  2. Eine weitere Ansicht außerhalb der ListView - aber ich muss dafür sorgen, dass die Position der ListView nach unten verschoben wird, wenn sie gezogen wird, und ich bin mir nicht sicher, ob wir erkennen können, ob die Berührungen der ListView beim Ziehen wirklich noch die Elemente in der ListView verschieben.

Irgendwelche Empfehlungen?

P.S. Ich frage mich, wann der offizielle Quellcode der Twitter-App veröffentlicht wird. Es wurde erwähnt, dass er veröffentlicht wird, aber es sind 6 Monate vergangen und wir haben seitdem nichts mehr davon gehört.

384voto

Randy Sugianto 'Yuku' Punkte 67957

Endlich hat Google eine offizielle Version der Pull-to-Refresh-Bibliothek veröffentlicht!

Sie heißt SwipeRefreshLayout innerhalb der Unterstützungsbibliothek, und die Dokumentation ist aquí :

  1. Añadir SwipeRefreshLayout als übergeordnetes Element der Ansicht, die als Zug behandelt wird, um das Layout zu aktualisieren. (Ich nahm ListView als Beispiel, es kann jeder sein View wie LinearLayout , ScrollView usw.)

     <android.support.v4.widget.SwipeRefreshLayout
         android:id="@+id/pullToRefresh"
         android:layout_width="match_parent"
         android:layout_height="wrap_content">
         <ListView
             android:id="@+id/listView"
             android:layout_width="match_parent"
             android:layout_height="match_parent"/>
     </android.support.v4.widget.SwipeRefreshLayout>
  2. Fügen Sie einen Hörer zu Ihrer Klasse hinzu

     protected void onCreate(Bundle savedInstanceState) {
         final SwipeRefreshLayout pullToRefresh = findViewById(R.id.pullToRefresh);
         pullToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
             @Override
             public void onRefresh() {
                 refreshData(); // your code
                 pullToRefresh.setRefreshing(false);
             }
         });
     }

Sie können auch anrufen pullToRefresh.setRefreshing(true/false); nach Ihren Anforderungen.

アップデイト

Die Android-Unterstützungsbibliotheken sind veraltet und wurden durch AndroidX ersetzt. Den Link zur neuen Bibliothek finden Sie unter aquí .

Außerdem müssen Sie die folgende Abhängigkeit zu Ihrem Projekt hinzufügen:

implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'

OR

Sie können zu Refactor>>Migrate to AndroidX gehen und Android Studio wird die Abhängigkeiten für Sie verwalten.

55voto

Erik Punkte 5671

Ich habe auch eine robuste, quelloffene, einfach zu verwendende und hochgradig anpassbare PullToRefresh-Bibliothek für Android implementiert. Sie können Ihre ListView durch die PullToRefreshListView ersetzen, wie in der Dokumentation auf der Projektseite beschrieben.

https://github.com/erikwt/PullToRefresh-ListView

44voto

Akah Punkte 1229

Der einfachste Weg ist meines Erachtens der, den die Android-Support-Bibliothek bietet:

Android.support.v4.widget.SwipeRefreshLayout;

Sobald diese importiert ist, können Sie Ihr Layout wie folgt definieren:

  <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/refresh"
        android:layout_height="match_parent"
        android:layout_width="match_parent">
    <android.support.v7.widget.RecyclerView
        xmlns:recycler_view="http://schemas.android.com/apk/res-auto"
        android:id="@android:id/list"
        android:theme="@style/Theme.AppCompat.Light"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/button_material_light"
        >

    </android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>

Ich gehe davon aus, dass Sie die Recycler-Ansicht anstelle der Listenansicht verwenden. Listview funktioniert jedoch weiterhin, Sie müssen also nur recyclerview durch listview ersetzen und die Verweise im Java-Code (Fragment) aktualisieren.

In Ihrem Aktivitätsfragment implementieren Sie zunächst die Schnittstelle, SwipeRefreshLayout.OnRefreshListener : i,e

public class MySwipeFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener{
private SwipeRefreshLayout swipeRefreshLayout;

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_item, container, false);
        swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh);
        swipeRefreshLayout.setOnRefreshListener(this);
}

 @Override
  public void onRefresh(){
     swipeRefreshLayout.setRefreshing(true);
     refreshList();
  }
  refreshList(){
    //do processing to get new data and set your listview's adapter, maybe  reinitialise the loaders you may be using or so
   //when your data has finished loading, cset the refresh state of the view to false
   swipeRefreshLayout.setRefreshing(false);

   }
}

Ich hoffe, dies hilft den Massen

23voto

Aracem Punkte 7107

Unter diesem Link finden Sie eine Abspaltung des berühmten PullToRefresh Ansicht, die neue interessante Implementierungen enthält, wie PullTorRefreshWebView o PullToRefreshGridView oder die Möglichkeit, eine PullToRefresh am unteren Rand einer Liste.

https://github.com/chrisbanes/Android-PullToRefresh

Und das Beste daran ist, dass es perfekt unter Android 4.1 funktioniert (die normale PullToRefresh funktioniert nicht )

19voto

mani Punkte 3264

Um Android Pull-to-Refresh zu implementieren, probieren Sie dieses Stück Code aus,

<android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/pullToRefresh"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

</android.support.v4.widget.SwipeRefreshLayout>

Klasse Aktivität:

ListView lv = (ListView) findViewById(R.id.lv);
SwipeRefreshLayout pullToRefresh = (SwipeRefreshLayout) findViewById(R.id.pullToRefresh);

lv.setAdapter(mAdapter);

pullToRefresh.setOnRefreshListener(new OnRefreshListener() {

        @Override
        public void onRefresh() {
            // TODO Auto-generated method stub

            refreshContent();

        }
    });

private void refreshContent(){ 

     new Handler().postDelayed(new Runnable() {
            @Override public void run() {
                pullToRefresh.setRefreshing(false);
            }
        }, 5000);

 }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X