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
engetItemViewType()
porposition >= 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 elx-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?