Как отобразить последнее сообщение в чате в Recycler View? - PullRequest
0 голосов
/ 05 февраля 2019

Я очень новичок в разработке для Android / Java.Я работаю над проектом, который включает в себя чат.

Я хочу, чтобы действие автоматически прокручивалось до нижней части экрана чата (самое последнее сообщение чата).

Я попытался отобразить счетчик getItem с помощью Toast - я смог убедиться, что могуправильно подберите позицию int моих предметов Recyclerview.Тем не менее, я пытаюсь использовать ScrollToPosition или SmoothScroltoPosition, чтобы получить желаемый результат.

Есть какие-нибудь идеи относительно того, как я могу автоматически прокрутить свой последний элемент чата?

Вот моя активность в чате ниже:

открытый класс ChatActivity расширяет AppCompatActivity {

private RecyclerView mRecyclerView;
private RecyclerView.Adapter mChatAdapter;
private RecyclerView.LayoutManager mChatLayoutManager;
private  String currentUserID, matchId, chatId;

private EditText mSendEditText;
private Button mSend;

DatabaseReference mDatabaseChat;
DatabaseReference mDatabaseChatDB;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);

    matchId = getIntent().getExtras().getString("matchid");
    currentUserID = FirebaseAuth.getInstance().getCurrentUser().getUid();

    mDatabaseChat = FirebaseDatabase.getInstance().getReference().child("User").child(currentUserID).child("connections").child("matches").child(matchId).child("ChatId");
    mDatabaseChatDB = FirebaseDatabase.getInstance().getReference().child("Chat");

    getChatID();

    mSend = (Button) findViewById(R.id.send);
    mSendEditText = (EditText) findViewById(R.id.message);


    mSend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            sendMessage();
        }

        private void sendMessage() {
            String sendMessageText = mSendEditText.getText().toString();
            if (!sendMessageText.isEmpty()){
                DatabaseReference newMessageDb = mDatabaseChatDB.push();

                Map newMessage = new HashMap<>();
                newMessage.put("createdByUser",currentUserID);
                newMessage.put("text", sendMessageText);

                newMessageDb.setValue(newMessage);
            }
            mSendEditText.setText(null);
        }
    });

    mRecyclerView = (RecyclerView) findViewById(R.id.chatview);
    mRecyclerView.setNestedScrollingEnabled(false);
    mRecyclerView.setHasFixedSize(false);
    mChatLayoutManager = new LinearLayoutManager(ChatActivity.this);
    mRecyclerView.setLayoutManager(mChatLayoutManager);
    mChatAdapter = new ChatAdapter(getDataSetChat(),ChatActivity.this);
    mRecyclerView.setAdapter(mChatAdapter);

}

private void getChatID(){
    mDatabaseChat.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                chatId = dataSnapshot.getValue().toString();
                mDatabaseChatDB = mDatabaseChatDB.child(chatId);
                getChatMessages();
            }
        }

        private void getChatMessages() {
            mDatabaseChatDB.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                    if (dataSnapshot.exists()){
                        String message = null;
                        String currentuser = null;

                        if (dataSnapshot.child("text").getValue() != null ){
                            message = dataSnapshot.child("text").getValue().toString();
                        }

                        if (dataSnapshot.child("createdByUser").getValue() != null ){
                            currentuser = dataSnapshot.child("createdByUser").getValue().toString();
                        }
                        if(message!= null && currentuser !=null){
                            Boolean currentUserBoolean = false;
                            if(currentuser.equals(currentUserID)){
                                currentUserBoolean = true;
                            }
                            ChatObject newMessage = new ChatObject(message,currentUserBoolean);
                            resultsChat.add(newMessage);
                            mChatAdapter.notifyDataSetChanged();
                        }
                    }
                }

                @Override
                public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                }

                @Override
                public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

                }

                @Override
                public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}
private ArrayList<ChatObject> resultsChat = new ArrayList<ChatObject>();
private List<ChatObject> getDataSetChat() {
    return resultsChat;
}

}

1 Ответ

0 голосов
/ 06 февраля 2019

Здравствуйте, @Asif Bin Zahit, чтобы получить последнее сообщение сверху, вы должны внести некоторые изменения в код, например:

После добавления последнего сообщения в список массивов resultsChat.add (newMessage) Вы должны отсортировать список массивов в порядке убывания, а затем после вызова notifyDataSetChanged

Если у вас уже есть записи в списке перед настройкой адаптера, то вам нужно отсортировать список, как описано ниже, и после этого установить адаптер на переработчик.view

Collections.sort(getDataSetChat())
mChatAdapter = new ChatAdapter(getDataSetChat(),ChatActivity.this);
mRecyclerView.setAdapter(mChatAdapter);

При добавлении нового сообщения в список

resultsChat.add(newMessage);
Collections.sort(resultsChat);
mChatAdapter.notifyDataSetChanged();

Он всегда будет добавлять ваше последнее сообщение в начало списка в программе повторного просмотра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...