it-swarm.com.de

So implementieren Sie Android Pull-to-Refresh

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 freigegeben wird), um den Inhalt zu aktualisieren.

Ich frage mich, wie Sie das Ihrer Meinung nach am besten umsetzen können.

Einige Möglichkeiten, die mir einfallen könnten:

  1. Ein Element über der ListView - ich halte es jedoch nicht für eine einfache Aufgabe, mit Animation in der ListView auf Elementposition 1 (0-basiert) zurückzuscrollen.
  2. Eine andere Ansicht außerhalb der ListView - aber ich muss darauf achten, die ListView-Position nach unten zu verschieben, wenn sie gezogen wird, und ich bin nicht sicher, ob wir erkennen können, ob das Ziehen auf die ListView die Elemente in der ListView noch wirklich verschiebt.

Irgendwelche Empfehlungen?

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

405

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

Es heißt SwipeRefreshLayout in der Unterstützungsbibliothek und die Dokumentation ist hier :

  1. Fügen Sie SwipeRefreshLayout als übergeordnetes Element der Ansicht hinzu. Dies wird als Pull-Vorgang behandelt, um das Layout zu aktualisieren. (Ich habe ListView als Beispiel genommen, es kann jedes View wie LinearLayout, ScrollView usw. sein.)

    <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 Ihrer Klasse einen Listener 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 pullToRefresh.setRefreshing(true/false); gemäß Ihrer Anforderung aufrufen.

266

Ich habe versucht, eine Pull-to-Refresh-Komponente zu implementieren. Sie ist alles andere als vollständig , zeigt jedoch eine mögliche Implementierung auf. https: // github.com/johannilsson/Android-pulltorefresh .

Die Hauptlogik ist in PullToRefreshListView implementiert, das ListView erweitert. Intern steuert es das Scrollen einer Header-Ansicht mit smoothScrollBy (API Level 8). Das Widget wird jetzt mit Unterstützung für 1.5 und höher aktualisiert. Lesen Sie jedoch die README für 1.5-Unterstützung.

In Ihren Layouts fügen Sie es einfach so hinzu.

<com.markupartist.Android.widget.PullToRefreshListView
    Android:id="@+id/Android:list"
    Android:layout_height="fill_parent"
    Android:layout_width="fill_parent"
    />
79

Ich habe auch eine robuste, Open Source, benutzerfreundliche 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

54
Erik

Der einfachste Weg, denke ich, ist, wie von der Android Support-Bibliothek zur Verfügung gestellt:

Android.support.v4.widget.SwipeRefreshLayout;

sobald das 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. Die Listenansicht funktioniert jedoch weiterhin. Sie müssen lediglich die Recyclingübersicht durch die Listenansicht 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);

   }
}

Hoffe das hilft den Massen

38
larrytech

In diesem Link finden Sie einen Zweig der berühmten PullToRefresh -Ansicht, der neue interessante Implementierungen wie PullTorRefreshWebView oder PullToRefreshGridView enthält, oder die Möglichkeit, einen PullToRefresh hinzuzufügen. am unteren Rand einer Liste.

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

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

21
Aracem

Um Android Pull-to-Refresh zu implementieren, probieren Sie diesen 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>

Aktivitätsklasse:

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

 }
18
mani

Ich habe sehr einfache Möglichkeit, dies zu tun, aber jetzt ist es der narrensichere Weg. Es gibt meinen Code PullDownListView.Java

package com.myproject.widgets;

import Android.content.Context;
import Android.util.AttributeSet;
import Android.view.MotionEvent;
import Android.widget.AbsListView;
import Android.widget.AbsListView.OnScrollListener;
import Android.widget.ListView;

/**
 * @author Pushpan
 * @date Nov 27, 2012
 **/
public class PullDownListView extends ListView implements OnScrollListener {

    private ListViewTouchEventListener mTouchListener;
    private boolean pulledDown;

    public PullDownListView(Context context) {
        super(context);
        init();
    }

    public PullDownListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public PullDownListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        setOnScrollListener(this);
    }

    private float lastY;

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            lastY = ev.getRawY();
        } else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
            float newY = ev.getRawY();
            setPulledDown((newY - lastY) > 0);
            postDelayed(new Runnable() {
                @Override
                public void run() {
                    if (isPulledDown()) {
                        if (mTouchListener != null) {
                            mTouchListener.onListViewPulledDown();
                            setPulledDown(false);
                        }
                    }
                }
            }, 400);
            lastY = newY;
        } else if (ev.getAction() == MotionEvent.ACTION_UP) {
            lastY = 0;
        }
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        setPulledDown(false);
    }

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

    public interface ListViewTouchEventListener {
        public void onListViewPulledDown();
    }

    public void setListViewTouchListener(
            ListViewTouchEventListener touchListener) {
        this.mTouchListener = touchListener;
    }

    public ListViewTouchEventListener getListViewTouchListener() {
        return mTouchListener;
    }

    public boolean isPulledDown() {
        return pulledDown;
    }

    public void setPulledDown(boolean pulledDown) {
        this.pulledDown = pulledDown;
    }
}

Sie müssen nur ListViewTouchEventListener in Ihrer Aktivität implementieren, in der Sie diese ListView verwenden und den Listener festlegen möchten

Ich habe es in PullDownListViewActivity implementiert

package com.myproject.activities;

import Android.app.Activity;
import Android.os.Bundle;

/**
 * @author Pushpan
 *
 */
public class PullDownListViewActivity extends Activity implements ListViewTouchEventListener {

    private PullDownListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        listView = new PullDownListView(this);
        setContentView(listView);
        listView.setListViewTouchListener(this);

        //setItems in listview
    }

    public void onListViewPulledDown(){
        Log.("PullDownListViewActivity", "ListView pulled down");
    }
}

Für mich geht das :)

18
Pushpan

Niemand hat die neue Art von "Zum Aktualisieren ziehen" erwähnt, die oben in der Aktionsleiste angezeigt wird, wie in der Anwendung "Google Now" oder "Google Mail".

Es gibt eine Bibliothek ActionBar-PullToRefresh die genauso funktioniert.

9
tomrozb

Beachten Sie, dass bei der Implementierung von Android und WP) Probleme mit UX auftreten können.

"Ein guter Indikator dafür, warum Designer/Entwickler Pull-to-Refresh nicht in der Art implementieren sollten, wie iOS-Apps es tun, ist, dass Google und ihre Teams Pull-to-Refresh bei Android währenddessen nicht verwenden benutze es in iOS. "

https://plus.google.com/109453683460749241197/posts/eqYxXR8L4eb

7
uobroin

Wenn Sie nicht möchten, dass Ihr Programm wie ein iPhone-Programm aussieht, das zwangsweise in Android integriert wird, streben Sie ein ursprünglicheres Erscheinungsbild an und tun Sie etwas Ähnliches wie Lebkuchen:

alt text

4
Lie Ryan

Ich habe hier eine Pull-to-Refresh-Komponente geschrieben: https://github.com/guillep/PullToRefresh Es funktioniert, wenn die Liste keine Elemente enthält, und ich habe sie auf> = 1.6 getestet Android Handys.

Jeder Vorschlag oder jede Verbesserung wird geschätzt :)

4
Guille Polito

Ich denke, die beste Bibliothek ist: https://github.com/chrisbanes/Android-PullToRefresh .

Arbeitet mit:

ListView
ExpandableListView
GridView
WebView
ScrollView
HorizontalScrollView
ViewPager
2
Jossy Paul

So erhalten Sie die neueste Lollipop Pull-To-Aktualisierung:

  1. Laden Sie das neueste Lollipop SDK und Extras/Android-Supportbibliothek herunter
  2. Setzen Sie das Build-Ziel des Projekts auf Android 5.0) (Andernfalls kann das Support-Paket Fehler mit Ressourcen enthalten.)
  3. Aktualisieren Sie Ihre libs/Android-support-v4.jar auf die 21. Version
  4. Verwenden Sie Android.support.v4.widget.SwipeRefreshLayout Plus Android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener

Eine ausführliche Anleitung finden Sie hier: http://antonioleiva.com/swiperefreshlayout/

Plus für ListView empfehle ich, über canChildScrollUp() in den Kommentaren zu lesen;)

1
goRGon

Sehr interessant Pull-to-Refresh von Yalantis . Gif für iOS, aber Sie können es überprüfen :)

<com.yalantis.pulltorefresh.library.PullToRefreshView
Android:id="@+id/pull_to_refresh"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<ListView
    Android:id="@+id/list_view"
    Android:divider="@null"
    Android:dividerHeight="0dp"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" />
1
edbaev