Lista sin fin de Android

¿Cómo puedo crear una lista en la que cuando se llega al final de la lista, se me notifica para poder cargar más elementos?

Una solución es implementar un OnScrollListener y realizar cambios (como agregar elementos, etc.) al ListAdapter en un estado conveniente en su método onScroll .

El ListActivity siguiente muestra una lista de números enteros, comenzando con 40, añadiendo elementos cuando el usuario se desplaza al final de la lista.

 public class Test extends ListActivity implements OnScrollListener { Aleph0 adapter = new Aleph0(); protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setListAdapter(adapter); getListView().setOnScrollListener(this); } public void onScroll(AbsListView view, int firstVisible, int visibleCount, int totalCount) { boolean loadMore = /* maybe add a padding */ firstVisible + visibleCount >= totalCount; if(loadMore) { adapter.count += visibleCount; // or any other amount adapter.notifyDataSetChanged(); } } public void onScrollStateChanged(AbsListView v, int s) { } class Aleph0 extends BaseAdapter { int count = 40; /* starting amount */ public int getCount() { return count; } public Object getItem(int pos) { return pos; } public long getItemId(int pos) { return pos; } public View getView(int pos, View v, ViewGroup p) { TextView view = new TextView(Test.this); view.setText("entry " + pos); return view; } } } 

Obviamente, debe utilizar hilos independientes para las acciones largas (como cargar datos web) y puede indicar el progreso en el último elemento de la lista (como las aplicaciones de mercado o de Gmail).

Sólo quería contribuir con una solución que utilicé para mi aplicación.

También se basa en la interfaz OnScrollListener , pero encontré que tenía un rendimiento de desplazamiento mucho mejor en dispositivos de gama baja, ya que ninguno de los cálculos de conteo visible / total se realizan durante las operaciones de desplazamiento.

  1. Permita que ListFragment o ListActivity implementen OnScrollListener
  2. Agregue los métodos siguientes a esa clase:

     @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //leave this empty } @Override public void onScrollStateChanged(AbsListView listView, int scrollState) { if (scrollState == SCROLL_STATE_IDLE) { if (listView.getLastVisiblePosition() >= listView.getCount() - 1 - threshold) { currentPage++; //load more list items: loadElements(currentPage); } } } 

    Donde currentPage es la página de su currentPage de datos que se debe agregar a su lista, y threshold es el número de elementos de lista (contados desde el final) que deberían, si es visible, activar el proceso de carga. Si establece el threshold en 0 , por ejemplo, el usuario tiene que desplazarse hasta el final de la lista para cargar más elementos.

  3. (Opcional) Como puede ver, la "carga más cheque" sólo se llama cuando el usuario deja de desplazarse. Para mejorar la usabilidad, puede inflar y agregar un indicador de carga al final de la lista a través de listView.addFooterView(yourFooterView) . Un ejemplo para una vista de pie de página:

     <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/footer_layout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="10dp" > <ProgressBar android:id="@+id/progressBar1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_gravity="center_vertical" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_toRightOf="@+id/progressBar1" android:padding="5dp" android:text="@string/loading_text" /> </RelativeLayout> 
  4. (Opcional) Finalmente, quite ese indicador de carga llamando a listView.removeFooterView(yourFooterView) si no hay más elementos o páginas.

Puede detectar el final de la lista con la ayuda de onScrollListener , el código de trabajo se presenta a continuación:

 @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (view.getAdapter() != null && ((firstVisibleItem + visibleItemCount) >= totalItemCount) && totalItemCount != mPrevTotalItemCount) { Log.v(TAG, "onListEnd, extending list"); mPrevTotalItemCount = totalItemCount; mAdapter.addMoreData(); } } 

Otra forma de hacerlo (adaptador interior) es la siguiente:

  public View getView(int pos, View v, ViewGroup p) { if(pos==getCount()-1){ addMoreData(); //should be asynctask or thread } return view; } 

Tenga en cuenta que este método se llamará muchas veces, por lo que necesita agregar otra condición para bloquear varias llamadas de addMoreData() .

Cuando agregue todos los elementos a la lista, por favor llame a notifyDataSetChanged () dentro de su adaptador para actualizar la Vista (debe ejecutarse en el subproceso UI – runOnUiThread )

En Ognyan Bankov GitHub encontrado una solución simple y de trabajo!

Utiliza la Volley HTTP library que facilita la creación de redes para las aplicaciones de Android y lo más importante, más rápido. Volley está disponible a través del repositorio AOSP abierto.

El código dado demuestra:

  1. ListView que se rellena con las peticiones paginadas HTTP.
  2. Uso de NetworkImageView.
  3. "Endless" paginación ListView con read-ahead.

Para la consistencia futura i bifurcó repo de Bankov .

Esta es una solución que también facilita mostrar una vista de carga al final de ListView mientras se está cargando.

Puedes ver las clases aquí:

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/helper/ListViewWithLoadingIndicatorHelper.java – Ayudante para que sea posible utilizar el Sin extenderse desde SimpleListViewWithLoadingIndicator.

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/listener/EndlessScrollListener.java – Listener que comienza a cargar datos cuando el usuario Está a punto de llegar a la parte inferior de ListView.

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SimpleListViewWithLoadingIndicator.java – El EndlessListView. Puede utilizar esta clase directamente o extenderla desde ella.

Puede ser un poco tarde, pero la siguiente solución resultó muy útil en mi caso. De una manera todo lo que necesitas hacer es añadir a tu ListView un Footer y crear para él addOnLayoutChangeListener .

http://developer.android.com/reference/android/widget/ListView.html#addFooterView(android.view.View)

Por ejemplo:

 ListView listView1 = (ListView) v.findViewById(R.id.dialogsList); // Your listView View loadMoreView = getActivity().getLayoutInflater().inflate(R.layout.list_load_more, null); // Getting your layout of FooterView, which will always be at the bottom of your listview. Eg you may place on it the ProgressBar or leave it empty-layout. listView1.addFooterView(loadMoreView); // Adding your View to your listview ... loadMoreView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { Log.d("Hey!", "Your list has reached bottom"); } }); 

Este evento se dispara una vez cuando un pie de página se vuelve visible y funciona como un encanto.

La clave de este problema es detectar el evento load-more, iniciar una solicitud asíncrona de datos y luego actualizar la lista. También se necesita un adaptador con indicador de carga y otros decoradores. De hecho, el problema es muy complicado en algunos casos de esquina. Sólo una implementación de OnScrollListener no es suficiente, porque a veces los elementos no llenan la pantalla.

He escrito un paquete personal que apoya la lista sin fin para RecyclerView , y también proporciona una ejecución async del cargador AutoPagerFragment que hace muy fácil conseguir los datos de una fuente multi-page. Puede cargar cualquier página que desee en un RecyclerView en un evento personalizado, no sólo en la página siguiente.

Aquí está la dirección: https://github.com/SphiaTower/AutoPagerRecyclerManager

La mejor solución hasta ahora que he visto está en la biblioteca de FastAdapter para las vistas del reciclador. Tiene un EndlessRecyclerOnScrollListener .

He aquí un ejemplo de uso: EndlessScrollListActivity

Una vez que lo usé para la lista de desplazamiento sin fin me he dado cuenta de que la configuración es muy robusto. Sin duda lo recomiendo.

He estado trabajando en otra solución muy similar a eso, pero, estoy usando un footerView para dar la posibilidad al usuario de descargar más elementos haciendo clic en el footerView , estoy usando un "menú" que se muestra encima del ListView y en el En la parte inferior de la vista principal, este "menú" oculta la parte inferior del ListView , por lo que cuando el listView se desplaza el menú desaparece y cuando el estado de desplazamiento está inactivo, el menú aparece de nuevo, pero cuando el usuario se desplaza al final de la listView , "Preguntar" para saber si el footerView se muestra en ese caso, el menú no aparece y el usuario puede ver el footerView para cargar más contenido. Aquí el código:

Saludos.

 listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub if(scrollState == SCROLL_STATE_IDLE) { if(footerView.isShown()) { bottomView.setVisibility(LinearLayout.INVISIBLE); } else { bottomView.setVisibility(LinearLayout.VISIBLE); } else { bottomView.setVisibility(LinearLayout.INVISIBLE); } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); 
  • Detectar si el contenido de EditText fue modificado por el usuario o por programa?
  • ¿Cómo obtener una lista de servicios en ejecución en Android?
  • Android: Obtención de la lista de aplicaciones del dispositivo - Muy lento
  • Android: diseño de vista personalizada para SectionIndexer e inhabilitación de SectionIndexer sobre la marcha
  • Método Call Activity del adaptador
  • Lista de reproducción de Youtube mostrada en ListView
  • Android - Inflando ListView
  • Java (Android) reordenando una lista de objetos
  • ¿Ordenar nombres en una lista alfabéticamente?
  • Lista de guardar de Android <String>
  • Cómo eliminar elementos de la casilla de verificación de la lista
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.