Cómo implementar Android Pull-to-Refresh

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

Me pregunto cuál es la mejor manera, en tu opinión, de implementar eso?

Algunas posibilidades que podría pensar:

  1. Un elemento encima de ListView; sin embargo, no creo que el desplazamiento hacia atrás a la posición 1 del artículo (basado en 0) con 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 cuando se tira de ella, y no estoy seguro si podemos detectar si los toques de arrastre a ListView aún realmente desplazan los elementos en el 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 pasaron 6 meses y no hemos tenido noticias de él desde entonces.

    Finalmente, Google lanzó una versión oficial de la biblioteca pull-to-refresh.

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

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

        

    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.

    Intenté implementar un componente de extracción para actualizar, está lejos de estar completo pero muestra una posible implementación, https://github.com/johannilsson/android-pulltorefresh .

    La lógica principal se implementa en PullToRefreshListView que extiende ListView . Internamente, controla el desplazamiento de una vista de encabezado usando smoothScrollBy (Nivel de API 8). El widget ahora se ha actualizado con soporte para 1.5 y versiones posteriores; no obstante, lea el archivo README para 1.5.

    En tus diseños simplemente lo agregas así.

      

    También implementé una biblioteca PullToRefresh robusta, de código abierto, fácil de usar y altamente personalizable para Android. Puede reemplazar su ListView con PullToRefreshListView como se describe en la documentación en la página del proyecto.

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

    La forma más fácil que creo es la proporcionada por la biblioteca de soporte de Android:

    android.support.v4.widget.SwipeRefreshLayout;

    una vez importado, puede hacer que su diseño se defina de la siguiente manera:

          

    Supongo que usa la vista de reciclador en lugar de listview. Sin embargo, listview todavía funciona, así que solo necesita reemplazar recyclerview con listview y actualizar las referencias en el código java (Fragment).

    En su fragmento de actividad, primero implementa 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 este enlace, puede encontrar una bifurcación de la famosa vista PullToRefresh que tiene nuevas implementaciones interesantes como PullTorRefreshWebView o PullToRefreshGridView o la posibilidad de agregar un PullToRefresh en el borde inferior de una lista.

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

    Y lo mejor de todo es que funciona perfecto en Android 4.1 (el PullToRefresh normal no funciona)

    Tengo una manera muy fácil de hacer esto pero ahora estoy seguro de que es una manera infalible. Hay 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 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 🙂

    Para implementar Pull-to-Refresh de Android, pruebe esta pieza de código,

         

    Clase de actividad:

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

    Nadie mencionó el nuevo tipo de “Pull to refresh” que se muestra en la parte superior de la barra de acciones, como en la aplicación Google Now o Gmail.

    Hay una biblioteca ActionBar-PullToRefresh que funciona exactamente igual.

    Tenga en cuenta que hay problemas de UX con los que lidiar cuando se implementa en Android y WP.

    “Un buen indicador de por qué los diseñadores / desarrolladores no deberían implementar pull-to-refresh en el estilo que usan las aplicaciones de iOS es cómo Google y sus equipos nunca usan pull-to-refresh en Android mientras lo usan en iOS”.

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

    Si no desea que su progtwig se vea como un progtwig de iPhone que se ajusta a la fuerza en Android, apunte a una apariencia más nativa y haga algo similar a Gingerbread:

    texto alternativo

    He escrito una extracción para actualizar el componente aquí: https://github.com/guillep/PullToRefresh Funciona evento si la lista no tiene elementos, y lo he probado en> = 1.6 teléfonos Android.

    Cualquier sugerencia o mejora es apreciada 🙂

    Creo que la mejor biblioteca es: https://github.com/chrisbanes/Android-PullToRefresh .

    Funciona con:

     ListView ExpandableListView GridView WebView ScrollView HorizontalScrollView ViewPager 

    Para obtener la última versión de Lollipop Pull-To Refresh:

    1. Descargue la última biblioteca de soporte Lollipop SDK y Extras / Android
    2. Establezca el objective de comstackción del proyecto en Android 5.0 (de lo contrario, el paquete de soporte puede tener errores con los recursos)
    3. Actualice su libs / android-support-v4.jar a la versión 21
    4. Utilice 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;)

    Muy interesante Pull-to-Refresh de Yalantis . Gif para iOS, pero puedes verificarlo 🙂