setcolorschemecolors recyclerview android listview android-listview pull-to-refresh

android - recyclerview - swiperefreshlayout



Cómo implementar Android Pull-to-Refresh (14)

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.


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

github.com/chrisbanes/Android-PullToRefresh

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


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


He intentado implementar un componente de extracción para actualizar, está lejos de estar 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 encabezado usando smoothScrollBy (API Level 8). El widget ahora se ha actualizado con el soporte para 1.5 y versiones posteriores, sin embargo, lea el archivo README para el soporte 1.5.

En tus diseños simplemente lo agregas así.

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


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 implementar Android Pull-to-Refresh pruebe este fragmento 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); }


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:


También he implementado 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


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