Saltar al contenido

Endless RecyclerView con ProgressBar para la paginación

Solución:

AQUÍ HAY UN ENFOQUE MÁS SIMPLE Y LIMPIO.

Implemente el desplazamiento sin fin de esta guía de Codepath y luego siga los siguientes pasos.

1. Agregue una barra de progreso debajo de RecyclerView.

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_movie_grid"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:paddingBottom="50dp"
        android:clipToPadding="false"
        android:background="@android:color/black"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </android.support.v7.widget.RecyclerView>

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="invisible"
        android:background="@android:color/transparent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

Aquí android: paddingBottom = “50dp” y android: clipToPadding = “falso” Es muy importante.

2. Obtenga una referencia a la barra de progreso.

progressBar = findViewById(R.id.progressBar);

3. Defina métodos para mostrar y ocultar la barra de progreso.

void showProgressView() {
    progressBar.setVisibility(View.VISIBLE);
}

void hideProgressView() {
    progressBar.setVisibility(View.INVISIBLE);
}

Implementé esto en mi antiguo proyecto, lo hice de la siguiente manera …

He creado un interface como hicieron los chicos de tus ejemplos

public interface LoadMoreItems {
  void LoadItems();
}

Luego agregué un addOnScrollListener() en mi Adapter

 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView,
                                   int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

                totalItemCount = linearLayoutManager.getItemCount();
                lastVisibleItem = linearLayoutManager
                        .findLastVisibleItemPosition();
                if (!loading
                        && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                    //End of the items
                    if (onLoadMoreListener != null) {
                        onLoadMoreListener.LoadItems();
                    }
                    loading = true;

                }
            }
        });

los onCreateViewHolder() es donde pongo el ProgressBar o no.

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,
                                                  int viewType) {
    RecyclerView.ViewHolder vh;
    if (viewType == VIEW_ITEM) {
        View v = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.list_row, parent, false);

        vh = new StudentViewHolder(v);
    } else {
        View v = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.progressbar_item, parent, false);

        vh = new ProgressViewHolder(v);
    }
    return vh;
}

En mi MainActivity ahí es donde pongo el LoadItems() para agregar los otros elementos es:

mAdapter.setOnLoadMoreListener(new LoadMoreItems() {
        @Override
        public void LoadItems() {
            DataItemsList.add(null);
            mAdapter.notifyItemInserted(DataItemsList.size() - 1);

            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    //   remove progress item
                    DataItemsList.remove(DataItemsList.size() - 1);
                    mAdapter.notifyItemRemoved(DataItemsList.size());
                    //add items one by one
                    //When you've added the items call the setLoaded()
                    mAdapter.setLoaded();
                    //if you put all of the items at once call
                    // mAdapter.notifyDataSetChanged();
                }
            }, 2000); //time 2 seconds

        }
    });

Para obtener más información, acabo de seguir esto. Github repository(Nota: esto está usando AsyncTask tal vez sea útil como mi respuesta, ya que lo hice manualmente, no con datos de API pero debería funcionar también) también esta publicación me fue útil sin fin-reciclador-vista-con-barra-de-progreso

Además, no sé si lo nombraste, pero también encontré esta publicación infinite_scrolling_recyclerview, tal vez también pueda ayudarte.

Si no es lo que está buscando, avíseme y dígame cuál es el problema con este código e intentaré modificarlo a su gusto.

Espero eso ayude.

EDITAR

Como no quieres quitar un elemento … Encontré, supongo que un tipo que quita el footer solo en este post: diseño-android-Infinity-Recyclerview.

Esto es para ListView pero sé que puedes adaptarlo a RecyclerView no está borrando ningún elemento que acaba de poner Visible/Invisible los ProgressBar echar un vistazo : detecting-end-of-listview

También eche un vistazo a: esta pregunta android-implementing-progressbar-and-loading-for-endless-list-like-android

Hay otra forma de hacer esto.

  • Primero regresa el getItemCount de su adaptador listItems.size() + 1

  • regreso VIEW_TYPE_LOADING en getItemViewType() por position >= listItems.size(). De esta manera, el cargador solo se mostrará al final de la lista de vista del reciclador. El único problema con esta solución es que incluso después de llegar a la última página, se mostrará el cargador, por lo que para solucionarlo debe almacenar el x-pagination-total-count en el adaptador, y

  • luego cambia la condición para devolver el tipo de vista a

    (position >= listItem.size())&&(listItem.size <= xPaginationTotalCount) .

Se me ocurrió esta idea ahora, ¿qué piensas?

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *