Je souhaite que mon RecyclerView défile vers le bas lorsqu'un nouvel élément est ajouté à la liste. Voici mon code:
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);
adapter = new RecyclerViewAdapter(data, recyclerView);
recyclerView.setAdapter(adapter);
Et quand je clique sur un bouton qui est en dessous de RecyclerView
, des données sont ajoutées à la liste:
public void addNewCard() {
data.add("New");
adapter.notifyItemInserted(data.size() - 1);
recyclerView.scrollToPosition(data.size() - 1);
}
Chaque fois que j'ajoute un élément, il défile toujours vers le haut. J'ai essayé d'utiliser smoothScrollToPosition()
et j'ai essayé d'utiliser scrollToPosition()
sur LinearLayoutManager
aussi. J'ai même essayé d'utiliser ViewTreeObserver
. J'ai essayé de changer la version de RecyclerView
dans les dépendances aussi. J'ai effectué une recherche approfondie sur Stack Overflow et aucune des solutions ne fonctionne pour moi.
Des idées sur ce qui pourrait être le problème? J'utilise RecyclerView
dans un fragment. Cela pourrait-il être une cause du problème?
Mon fichier .xml pour le RecyclerView
<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.NestedScrollView
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:id="@+id/scroll_view_recycler"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<RelativeLayout
Android:id="@+id/rel_layout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<Android.support.v7.widget.RecyclerView
Android:id="@+id/listView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginTop="6dp" />
<Button
Android:id="@+id/button_add_new_card"
style="@style/Widget.AppCompat.Button.Borderless"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_below="@id/listView"
Android:layout_marginBottom="16dp"
Android:layout_marginTop="8dp"
Android:padding="20dp"
Android:text="+ Add new Item" />
</RelativeLayout>
</Android.support.v4.widget.NestedScrollView>
Cela se produit parce que votre
recyclerView.scrollToPosition (data.size () - 1);
est appelé en premier, puis la liste est en cours d'initialisation. Vous devez ajouter cette ligne après l'initialisation de votre vue Vue recycleur. Vous pouvez ajouter cette ligne dans un gestionnaire.
Peut-être que cela aidera quelqu'un
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
if (pingAdapter != null) {
Ping ping = dataSnapshot.getValue(Ping.class);
pingAdapter.pings.add(ping);
recyclerView.smoothScrollToPosition(pingAdapter.getItemCount());
pingAdapter.notifyDataSetChanged();
}
}
recyclerView.smoothScrollToPosition(pingAdapter.pings.size());
est encore plus rapide