web-dev-qa-db-ja.com

RecyclerViewの下部まで自動的にスクロール

レイアウトファイル内にRecyclerViewがあるフラグメントがあります。 RecyclerViewはチャットでメッセージを保持します。したがって、当然、チャットフラグメントが開かれたときにRecyclerViewが一番下までスクロールする必要があります。

RecyclerViewで直接スクロールしてみました:

var mRecyclerView = view.FindViewById<RecyclerView>
mRecyclerView.ScrollToPosition(mMessages.Count-1);

2番目の方法:

LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(Application.Context);
mRecyclerView.SetLayoutManager(mLinearLayoutManager);
mLinearLayoutManager.ScrollToPosition(mMessages.Count - 1);      

3番目の方法:

LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(Application.Context);
mRecyclerView.SetLayoutManager(mLinearLayoutManager);
mLinearLayoutManager.ScrollToPositionWithOffset(mMessages.Count - 1, 0);

残念ながら、どちらの場合も何も起こりません。どんな提案も大歓迎です!

9
rasperryPi

問題を解決するには、smoothScrollToPositionを使用してください。私は常にsmoothScrollToPositionを使用して、任意の位置にリダイレクトします。

mMessagesのサイズは、あなたが思っているほど良いものであることを確認してください。

例、

RecyclerView rv = (RecyclerView)findViewById(R.id.recyclerView);
rv.smoothScrollToPosition(mMessages.count-1);
12

setStackFromEnd=trueは、最後の要素を表示するようにビューを設定します。レイアウトの方向は同じままです。

編集後、更新しました:このように:

   LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(Application.Context);
   mLinearLayoutManager.setStackFromEnd(true); 
   mRecyclerView.SetLayoutManager(mLinearLayoutManager);
   mRecyclerView.scrollToPosition(mMessages.Count-1);

ドキュメント を確認してください。

Edit:問題は、レイアウトマネージャーをrecyclerviewに設定せずにscrollToPositionを呼び出していることです。

RecyclerViewクラスのscrollToPosition関数を考慮すると、ケースは理にかなっています。

/**
     * Convenience method to scroll to a certain position.
     *
     * RecyclerView does not implement scrolling logic, rather forwards the call to
     * {@link Android.support.v7.widget.RecyclerView.LayoutManager#scrollToPosition(int)}
     * @param position Scroll to this adapter position
     * @see Android.support.v7.widget.RecyclerView.LayoutManager#scrollToPosition(int)
     */
    public void scrollToPosition(int position) {
        if (mLayoutFrozen) {
            return;
        }
        stopScroll();
        if (mLayout == null) {
            Log.e(TAG, "Cannot scroll to position a LayoutManager set. " +
                    "Call setLayoutManager with a non-null argument.");
            return;
        }
        mLayout.scrollToPosition(position);
        awakenScrollBars();
    }

LayoutManagerセットを配置するためにスクロールできません。 null以外の引数を指定してsetLayoutManagerを呼び出します。

5
ziLk

私はあなたがそれを正しい方法で呼んでいないと信じています。機能させるには、LinearLayoutManagerとリサイクラービューを渡す必要があります。ここで私はそれをどのように機能させましたか

mLayoutManager.smoothScrollToPosition(mRecyclerView, null, array.size() - 1);
2
Irfan Raza

私は問題を見つけました、LayoutManagerを設定した後にRecyclerView scrollToPositionまたはsmoothScrollToPositionを設定します。

RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.scrollToPosition(mMessages.count - 1);

それがあなたを助けることを願っています。

1
Shamsul

setStackFromEnd=trueまたはsetReverseLayout=true LLMがアイテムを最後からレイアウトするようにします。

これら2つの違いは、setStackFromEndは最後の要素を表示するようにビューを設定し、レイアウトの方向は同じままであることです。 (したがって、左から右への水平方向のリサイクラービューでは、最後の要素が表示され、左にスクロールすると前の要素が表示されます)

一方、setReverseLayoutは、アダプターによって追加された要素の順序を変更します。レイアウトは、LTRリサイクラービューの一番左にある最後の要素から始まり、次に右にスクロールすると、前の要素が表示されます。

サンプル :

final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setReverseLayout(true);
_listView.setLayoutManager(linearLayoutManager);
0
Vishrut Mavani