473 votes

Comment mettre en œuvre Android Pull-to-Refresh

Sur Android applications telles que Twitter (application officielle), lorsque vous rencontrez un ListView, vous pouvez tirer vers le bas (et il va rebondir lorsqu'il est relâché) pour actualiser le contenu.

Je me demande quelle est la meilleure façon, à votre avis, pour le mettre en œuvre?

Certaines possibilités, je pense:

  1. Un élément en haut de la liste - mais je ne pense pas que le défilement arrière de l'élément en position 1 (0) avec animation sur la liste est une tâche facile.
  2. Un autre point de vue à l'extérieur de la ListView - mais j'ai besoin de prendre soin de déplacement de la ListView position vers le bas quand il est tiré, et je ne suis pas sûr si l'on peut détecter si le glisser touche à la ListView encore vraiment faire défiler les éléments de la Liste.

Toutes les recommandations?

P. S. je me demande quand le Twitter officiel app code source est publié. Il a été mentionné qu'il sera libéré, mais 6 mois a passé et nous n'avons pas entendu parler d'elle depuis.

370voto

yuku Points 15705

Enfin, Google a publié une version officielle de la bibliothèque pull-to-refresh!

Il s'appelle SwipeRefreshLayout, dans la bibliothèque de support, et la documentation est ici:

https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html

81voto

Johan Nilsson Points 1224

J'ai fait une tentative de mettre en œuvre un pull à l'actualisation des composants, il est loin d'être complète , mais il montre une possible mise en œuvre, https://github.com/johannilsson/android-pulltorefresh.

Logique principale est mis en œuvre en PullToRefreshListView qui s'étend au - ListView. En interne, il contrôle la vitesse de défilement d'une vue d'en-tête à l'aide de smoothScrollBy API (Niveau 8). Le widget est maintenant mis à jour avec le support pour la 1.5 et les versions ultérieures, veuillez lire le fichier lisez-moi pour 1,5 soutien.

Dans vos mises en page, il vous suffit de l'ajouter comme cela.

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

55voto

Erik Points 2065

J'ai également mis en place une bibliothèque PullToRefresh robuste, open source, facile à utiliser et hautement personnalisable pour Android. Vous pouvez remplacer votre ListView par PullToRefreshListView comme décrit dans la documentation sur la page du projet.

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

23voto

Aracem Points 3331

Dans ce lien, vous pouvez vérifier un fork de la fameuse vue pullToRefresh qui a de nouvelles implémentations intéressantes comme pullTorRefreshWebView ou pullToRefreshGridView ou hability pour mettre un pullToRefresh sur le bord du bouton de la liste.

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

Et le meilleur de ce travail est parfait dans Android 4.1 (le pullToRefresh normal ne fonctionne pas)

18voto

Pushpan Points 209

J'ai un moyen très facile de le faire, mais maintenant, il est sûr de sa façon infaillible Il y a mon 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;
    }
}
 

Vous avez juste besoin d'implémenter ListViewTouchEventListener sur votre activité où vous voulez utiliser cette ListView et définir l'écouteur

Je l'ai implémenté dans PullDownListViewActivity

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

Ça marche pour moi :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X