レイアウトファイル内に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);
残念ながら、どちらの場合も何も起こりません。どんな提案も大歓迎です!
問題を解決するには、smoothScrollToPosition
を使用してください。私は常にsmoothScrollToPosition
を使用して、任意の位置にリダイレクトします。
mMessages
のサイズは、あなたが思っているほど良いものであることを確認してください。
例、
RecyclerView rv = (RecyclerView)findViewById(R.id.recyclerView);
rv.smoothScrollToPosition(mMessages.count-1);
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を呼び出します。
私はあなたがそれを正しい方法で呼んでいないと信じています。機能させるには、LinearLayoutManagerとリサイクラービューを渡す必要があります。ここで私はそれをどのように機能させましたか
mLayoutManager.smoothScrollToPosition(mRecyclerView, null, array.size() - 1);
私は問題を見つけました、LayoutManagerを設定した後にRecyclerView scrollToPositionまたはsmoothScrollToPositionを設定します。
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.scrollToPosition(mMessages.count - 1);
それがあなたを助けることを願っています。
setStackFromEnd=true
またはsetReverseLayout=true
LLMがアイテムを最後からレイアウトするようにします。
これら2つの違いは、setStackFromEnd
は最後の要素を表示するようにビューを設定し、レイアウトの方向は同じままであることです。 (したがって、左から右への水平方向のリサイクラービューでは、最後の要素が表示され、左にスクロールすると前の要素が表示されます)
一方、setReverseLayout
は、アダプターによって追加された要素の順序を変更します。レイアウトは、LTRリサイクラービューの一番左にある最後の要素から始まり、次に右にスクロールすると、前の要素が表示されます。
サンプル :
final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setReverseLayout(true);
_listView.setLayoutManager(linearLayoutManager);