setcolorschemecolors - Cómo implementar Android Pull-to-Refresh




swiperefreshlayout setcolorschemecolors (10)

Creo que la forma más sencilla es la proporcionada por la biblioteca de soporte de Android:

android.support.v4.widget.SwipeRefreshLayout;

Una vez que se haya importado, puede tener su diseño definido de la siguiente manera:

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

Supongo que utiliza la vista de reciclador en lugar de la vista de lista. Sin embargo, listview todavía funciona, por lo que solo debe reemplazar recyclerview con listview y actualizar las referencias en el código java (Fragmento).

En tu fragmento de actividad, primero implementas la interfaz, 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);

   }
}

Espero que esto ayude a las masas.

En aplicaciones de Android como Twitter (aplicación oficial), cuando se encuentra con un ListView, puede bajarlo (y se recuperará cuando se publique) para actualizar el contenido.

Me pregunto cuál es la mejor manera, en su opinión, para implementar eso.

Algunas posibilidades que podría pensar:

  1. Un elemento en la parte superior de ListView; sin embargo, no creo que desplazarse de nuevo a la posición 1 (basada en 0) con la animación en ListView sea una tarea fácil.
  2. Otra vista fuera de ListView, pero tengo que ocuparme de mover la posición de ListView hacia abajo cuando se tira, y no estoy seguro de si podemos detectar si el arrastre al ListView aún desplaza los elementos en ListView.

¿Alguna recomendación?

PD: Me pregunto cuándo se lanzará el código fuente oficial de la aplicación de Twitter. Se ha mencionado que será lanzado, pero han pasado 6 meses y no hemos escuchado sobre eso desde entonces.



Finalmente, Google lanzó una versión oficial de la biblioteca de extracción para actualizar.

Se llama SwipeRefreshLayout , dentro de la biblioteca de soporte, y la documentación está here :

1) Agregue SwipeRefreshLayout como elemento principal de la vista que se tratará como una extracción para actualizar el diseño. (Tomé ListView como ejemplo, puede ser cualquier View como LinearLayout , ScrollView , etc.)

<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) Agregue un oyente a su clase

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

También puede llamar a pullToRefresh.setRefreshing(true/false); según su requerimiento.


He escrito un pull para actualizar el componente aquí: https://github.com/guillep/PullToRefresh Funciona si la lista no tiene elementos y lo he probado en teléfonos Android = = 1.6.

Cualquier sugerencia o mejora es apreciada :)


Muy interesante Pull-to-Refresh por Yalantis . Gif para iOS, pero puedes comprobarlo :)

<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" />


Nadie ha mencionado el nuevo tipo de "Extraer para actualizar", que se muestra en la parte superior de la barra de acción, como en la aplicación Google Now o Gmail.

Hay una biblioteca ActionBar-PullToRefresh que funciona exactamente igual.


Para obtener el último Lollipop Pull-To Refresh:

  1. Descarga la última biblioteca de soporte de Lollipop SDK y Extras / Android
  2. Configure el objetivo de construcción del proyecto en Android 5.0 (de lo contrario, el paquete de soporte puede tener errores con los recursos)
  3. Actualiza tus libs / android-support-v4.jar a la versión 21
  4. Use android.support.v4.widget.SwipeRefreshLayout plus android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener

La guía detallada se puede encontrar aquí: http://antonioleiva.com/swiperefreshlayout/

Además de ListView, recomiendo leer sobre canChildScrollUp() en los comentarios;)


Si no quieres que tu programa se vea como un programa de iPhone que se integra a la fuerza en Android, apunta a una apariencia más nativa y haz algo similar a Gingerbread:


Tenga en cuenta que hay problemas de UX con los que lidiar al implementar en Android y WP.

"Un gran indicador de por qué los diseñadores / desarrolladores no deberían implementar la aplicación de extracción a actualización al estilo de las aplicaciones de iOS es cómo Google y sus equipos nunca usan la aplicación de actualización de actualización en Android mientras que la usan en iOS".

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


Tengo una forma muy fácil de hacer esto, pero ahora estoy seguro de que es una manera infalible. Está mi código 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;
    }
}

Solo necesita implementar ListViewTouchEventListener en su actividad en la que desea usar este ListView y configurar el oyente

Lo tengo implementado en 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");
    }
}

Esto funciona para mi :)





pull-to-refresh