web-dev-qa-db-fra.com

RecyclerView faites défiler jusqu'à la position lorsqu'un nouvel élément est ajouté

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>
13
Arshad Yusuf

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.

0
Diya Bhat

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

0
Koala