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 libere) para actualizar el contenido.

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

Algunas posibilidades que pude pensar:

  1. Un elemento en la parte superior de la ListView – sin embargo, no creo que el desplazamiento de nuevo a la posición del artículo 1 (basado en 0) con la animación en el ListView es una tarea fácil.
  2. Otra vista fuera de ListView – pero tengo que cuidar de mover la posición ListView hacia abajo cuando se tira, y no estoy seguro de si podemos detectar si los toques de arrastre para el ListView todavía realmente desplazar los elementos en el ListView.

¿Alguna recomendación?

PS Me pregunto cuándo se publicará 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 oído hablar de él desde entonces.

Por último, Google lanzó una versión oficial de pull-to-refresh biblioteca!

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

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

He intentado implementar un componente pull para actualizar, está lejos de ser completo, pero demuestra 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 cabecera usando smoothScrollBy (API Level 8). El widget ahora se actualiza con soporte para 1.5 y versiones posteriores; por favor, lea el archivo README para 1.5.

En tus diseños simplemente agrega esto.

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

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

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

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

Android.support.v4.widget.SwipeRefreshLayout;

Una vez que se importa, entonces usted 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 listview. Sin embargo, listview sigue funcionando así que sólo necesita 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 este enlace, puede encontrar un tenedor 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 el trabajo perfecto en Android 4.1 (el normal PullToRefresh no funciona)

Tengo manera muy fácil de hacer esto, pero ahora seguro su la 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; } } 

Sólo tiene que implementar ListViewTouchEventListener en su actividad donde desea utilizar este ListView y establecer el oyente

Lo he 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 Android Tire-para-Refrescar pruebe este pedazo de código,

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

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 ha mencionado el nuevo tipo de "Pull to refresh" que aparece 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.

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

"Un gran indicador de por qué los diseñadores / desarrolladores no deben implementar pull-to-refresh en el estilo de aplicaciones iOS es cómo Google y sus equipos nunca utilizan pull-to-refresh en Android, mientras que lo utilizan en iOS.

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

Si usted no quiere que su programa se parezca a un programa de iPhone que se adapta a la fuerza en Android, apunte a una apariencia más nativa y haga algo similar a Gingerbread:

texto alternativo

He escrito un pull para actualizar el componente aquí: https://github.com/guillep/PullToRefresh Funciona el evento si la lista no tiene artículos, 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 el último Lollipop Pull-To Refresh:

  1. Descargue la última colección de Lollipop SDK y Extras / Android
  2. Establezca la meta de compilació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. Usa android.support.v4.widget.SwipeRefreshLayout más android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener

Puede encontrar una guía detallada aquí: http://antonioleiva.com/swiperefreshlayout/

Además de ListView le recomiendo leer acerca de canChildScrollUp() en los comentarios;)

Muy interesante para refrescar 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" /> 

  • Deslizar hacia abajo para actualizar el diseño del material
  • Refrescante adaptador al tirar de ListView en android
  • ¿Cómo deshabilitar la acción "pull to refresh" y usar sólo el indicador?
  • Retener la posición de desplazamiento en Pull To Refresh
  • ¿Funciona PullToRefresh con FragmentPagerAdapter?
  • Android: Tire para actualizar para GridView
  • Cómo implementar "Deslizar hacia abajo para actualizar" como en la nueva aplicación de GMail
  • Android Pull para actualizar ListView: eliminar la pista de flecha
  • Adaptar chrisbanes ActionBar-PullToRefresh a fragmentos (NavigationDrawer)
  • Utilizar PullToRefreshExpandableListView en Fragmento
  • Galería QuiltView con Pull para actualizar en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.