1

私はRecyclerViewテキストアプリタイプの方法でメッセージを表示するために使用しています。つまり、に追加された新しいメッセージRecyclerViewが下部に表示されるはずです。

現在、メッセージを下から表示するため.setStackFromEnd(true)に on myを使用しています。LinearLayoutManager

layMng = new LinearLayoutManager(this);
layMng.setStackFromEnd(true);

mRecyclerView.setLayoutManager(layMng);
mRecyclerView.setAdapter(mAdapter);

何が起こるかというと、十分な数のメッセージが受信され、メッセージのリストが画面の上部を超えてオーバーフローしそうになると、常に下部に新しいメッセージが表示されなくなります。新しい追加を表示するには、手動で下にスクロールする必要があります。

常に最新のメッセージを表示できるようにするかRecyclerView、新しいアイテムを受信したときに下にスクロールするようにするにはどうすればよいですか?

.scrollToPosition()レイアウトマネージャーでさまざまな方法を試し.scrollToPositionWithOffset()ましたが、これまでに見た提案はどれもうまくいきませんでした。この問題に関するいくつかの上位の StackOverflow の質問には、元の質問を解決することさえできない上位の回答があります..

それで、これはどのように行われますか?

4

4 に答える 4

0

これを試してみてください。チャットアプリケーションも開発していますが、私にとっては完璧に機能します

    mRecyclerView.setAdapter(adaptorChat);
    mRecyclerView.setHasFixedSize(true);
    LinearLayoutManager llm = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
    llm.setStackFromEnd(true);
    mRecyclerView.setLayoutManager(llm);

XML

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <android.support.v7.widget.RecyclerView
        android:id="@+id/messages_list_sponsor"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/edit_compose_msg_container" />

    <LinearLayout
        android:id="@+id/edit_compose_msg_container"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:orientation="horizontal"
        android:padding="3dp">

        <EditText
            android:id="@+id/compose_edit_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginLeft="10dp"
            android:layout_marginStart="10dp"
            android:layout_weight="1"
            android:background="@drawable/white_edit_text_style"
            android:hint="@string/enter_message"
            android:inputType="textMultiLine"
            android:minHeight="50dp"
            android:paddingEnd="4dp"
            android:paddingLeft="6dp"
            android:paddingRight="4dp"
            android:paddingStart="6dp"
            android:singleLine="false"
            android:textColor="@color/black"
            android:textColorHint="@android:color/darker_gray" />

        <ImageView
            android:id="@+id/send_button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="5"
            android:clickable="true"
            android:padding="15dp"
            android:rotation="-35"
            android:layout_marginBottom="5dp"
            android:src="@drawable/message_send" />
    </LinearLayout>
</RelativeLayout>
于 2016-06-23T04:15:24.737 に答える
0

mRecyclerView.scrollToPosition(position);動作するはずです。位置/アダプターが更新される前にスクロールしようとしている可能性があります。試す:

int delay = 500;

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    public void run() {
        //scroll to bottom
        mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount());
    }
}, delay);
于 2016-06-23T05:55:51.320 に答える
0

mRecyclerView.setNestedScrollingEnabled(false)を設定している場合は、これを削除してください。

于 2019-08-12T13:00:56.547 に答える