web-dev-qa-db-ja.com

RecyclerViewは、新しいアイテムが追加されたときに位置までスクロールします。

新しいアイテムがリストに追加されたときにRecyclerViewを一番下までスクロールさせたい。以下は私のコードです:

_RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(layoutManager);

adapter = new RecyclerViewAdapter(data, recyclerView);
recyclerView.setAdapter(adapter);
_

RecyclerViewの下にあるボタンをクリックすると、データがリストに追加されます。

_public void addNewCard() {
    data.add("New");
    adapter.notifyItemInserted(data.size() - 1);
    recyclerView.scrollToPosition(data.size() - 1);
}
_

アイテムを追加すると、常に一番上の位置までスクロールされます。 smoothScrollToPosition()を使用してみましたが、LinearLayoutManagerでもscrollToPosition()を使用してみました。 ViewTreeObserverを使ってみました。依存関係でもRecyclerViewのバージョンを変更しようとしました。 Stack Overflowを徹底的に検索しましたが、どのソリューションもうまくいきませんでした。

何が問題になるかについてのアイデアはありますか?フラグメント内でRecyclerViewを使用しています。それが問題の原因でしょうか?

RecyclerViewの.xmlファイル

_<?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

これはあなたのために起こっています

recyclerView.scrollToPosition(data.size()-1);

最初に呼び出され、次にリストが初期化されています。 Recycler Viewビューが初期化された後で、この行を追加する必要があります。この行をハンドラーに追加できます。

0
Diya Bhat

多分これは誰かを助けるでしょう

@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());

さらに速い

0
Koala