添加到RecyclerView的项目未显示在

时间:2016-06-23 04:11:16

标签: android android-recyclerview recycler-adapter linearlayoutmanager

我有一个RecyclerView用于以文本应用类型的方式显示消息。我的意思是,添加到RecyclerView的新邮件应显示在底部。

目前,我在.setStackFromEnd(true)上使用LinearLayoutManager来显示消息从底部开始:

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

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

当收到足够的消息并且消息列表即将溢出屏幕顶部时,会发生什么情况,它会停止始终在底部显示新消息。我必须手动向下滚动以查看新增内容。

如何才能让最新消息可以查看,或者在收到新项目时向下滚动RecyclerView

我在我的布局管理器上尝试了各种方法,例如.scrollToPosition().scrollToPositionWithOffset(),但到目前为止我看到的建议都没有奏效。关于这个问题的一些顶级StackOverflow问题有顶级答案,甚至没有解决原始问题..

那怎么办呢?

4 个答案:

答案 0 :(得分:1)

请检查layout_height。它应该是android:layout_height =“match_parent”

在UI线程中运行smoothScrollToPosition

我的代码中的代码段

            <android.support.v7.widget.RecyclerView
                android:id="@+id/topic_screen_list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginBottom="18dp"

                />

//这里topicScreenList引用了我的Recylerview: // - messageAdapter:引用adpapter对象

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

    LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
    layoutManager.setStackFromEnd(true);
    topicScreenList.setLayoutManager(layoutManager);
    topicScreenList.setAdapter(messageAdapter);
}
获取任何新消息后,

从后端服务

调用以下代码

-Hey MessageItem正在引用适配器消耗的新消息项

@Override
public void onNewMessage(final MessageItem messageItem) {
    if (getActivity() != null) {
        getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {                  
               messageAdapter.addMessageToEnd(messageItem);

       topicScreenList.smoothScrollToPosition(messageAdapter.getItemCount());

            }
        });
    }
}


//code from my Adapter  
public void addMessageToEnd(MessageItem messageItem) {
    messageItems.add(messageItem);
    notifyItemInserted(messageItems.size() -1);
}

答案 1 :(得分: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>

答案 2 :(得分: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);

答案 3 :(得分:0)

如果已设置 mRecyclerView.setNestedScrollingEnabled(false),则将其删除。