如何将最后一个文档添加到recyclerview的底部?

时间:2018-07-22 07:15:08

标签: java android firebase android-recyclerview google-cloud-firestore

基本上,我想使消息与通常的聊天应用程序中的消息对齐。

现在,消息在RecyclerView中已正确对齐。但是,每当我发送新消息时,它将它们置于其他消息的顶部。每当我回头再来一次,活动消息都会被正确安排(甚至是最上面的消息)。

我只希望我发送的消息显示在底部。任何帮助将不胜感激

mLinearLayout.setReverseLayout(true);

然后:

private void loadmessage() {
mFirestore.collection("Users").orderBy("Timestamp", Query.Direction.DESCENDING).limit(10).addSnapshotListener(new EventListener<QuerySnapshot>() {
    @Override
    public void onEvent(@Nullable QuerySnapshot snapshots,
                        @Nullable FirebaseFirestoreException e) {
        if (e != null) {
            Log.w("TAG", "listen:error", e);
            return;
        }

        for (DocumentChange dc : snapshots.getDocumentChanges()) {
            switch (dc.getType()) {
                case ADDED:
                    Message message = dc.getDocument().toObject(Message.class);
                    messageList.add(message);
                    mAdapter.notifyDataSetChanged();
                    mMessagesList.scrollToPosition(messageList.size()-10);
                    break;
            }
        }
    }
});

}

3 个答案:

答案 0 :(得分:2)

要解决此问题,您需要像这样更改查询:

mFirestore.collection("Users")
    .orderBy("Timestamp", Query.Direction.DESCENDING)
    .limit(10)
    .addSnapshotListener(/* ... */);

您的RecyclerView应该如下所示:

LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
layoutManager.setReverseLayout(true);
layoutManager.setStackFromEnd(true);
recyclerView.setLayoutManager(layoutManager);

此方法将根据您的需要将订单撤消。

编辑:

您可以遍历getItem()方法来像这样反转项目查找:

@Override
public HashMap getItem(int pos) {
    return super.getItem(getCount() - 1 - pos);
}

答案 1 :(得分:0)

尝试一下...

 recyclerView.scrollToPosition(messageList.size()-1);
 mAdapter.notifyDataSetChanged();

答案 2 :(得分:0)

Here是相同的情况,它也有答案。因此,以防万一有人在寻找答案。亚历克斯说过各种解决这类情况的方法。

This是firestore聊天应用程序功能的github存储库。