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.

18voto

Pushpan Punkte 277

Ich habe eine sehr einfache Möglichkeit, dies zu tun, aber ich bin mir nicht sicher, ob es der narrensichere Weg ist. Hier ist mein 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 möchten, und den Listener setzen

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

Das funktioniert bei mir :)

10voto

tomrozb Punkte 24642

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

Es gibt eine Bibliothek ActionBar-PullToRefresh die genau so funktioniert.

7voto

uobroin Punkte 181

Beachten Sie, dass bei der Implementierung auf Android und WP UX-Probleme zu bewältigen sind.

"Ein guter Indikator dafür, warum Designer/Entwickler Pull-to-Refresh nicht im Stil von iOS-Apps implementieren sollten, ist die Tatsache, dass Google und seine Teams Pull-to-Refresh bei Android nie verwenden, während sie es bei iOS sehr wohl nutzen. "

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

4voto

Lie Ryan Punkte 57966

Wenn Sie nicht möchten, dass Ihr Programm wie ein iPhone-Programm aussieht, das in Android eingepasst wurde, sollten Sie ein natives Erscheinungsbild anstreben und etwas Ähnliches wie Gingerbread machen:

alt text

2voto

Jossy Paul Punkte 1237

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

Funktioniert mit:

ListView
ExpandableListView
GridView
WebView
ScrollView
HorizontalScrollView
ViewPager

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