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?
- Implementación de la atracción de Chris Banes para actualizar junto con desplazamiento horizontal en la vista de lista
- Xamarin Forms ListView Programatic Refresh No se detiene en Android cuando se carga la página
- Lista de PullToRefresh con el encabezado de sección fijado
- FragmentManager reemplazar fragmentos sin llamar onPause () onDestroy () para el fragmento antiguo
- Cómo implementar pull para actualizar en un ListFragment
Algunas posibilidades que pude pensar:
- 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.
- 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.
- Tire para actualizar para GridView en Android
- Android Pull-to-Refresh con Fragmento ListView y Adaptador ListView personalizado
- Tire para actualizar para Android y Phonegap
- ¿Por qué necesitamos actualizar la aplicación para móviles?
- Android PullToRefresh onScrollListener no funciona
- Cómo pasar la matriz int de identificadores de recursos de color desde array.xml a SwipeRefreshLayout.setColorSchemeResources
- ¿Puedo usar Pull para actualizar sin utilizar ScrollView / ListView?
- ¿Cómo puedo configurar un ListView personalizado con un divisor mediante Android?
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 El widget ahora se actualiza con soporte para 1.5 y versiones posteriores; por favor, lea el archivo README para 1.5. smoothScrollBy
(API Level 8).
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.
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:
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:
- Descargue la última colección de Lollipop SDK y Extras / Android
- 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)
- Actualiza tus libs / android-support-v4.jar a la versión 21
- Usa
android.support.v4.widget.SwipeRefreshLayout
másandroid.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" />