Я создаю приложение чата в Android с использованием Firebase, и я столкнулся с досадной проблемой, которую не знаю, как ее исправить. Каждый раз, когда я нажимаю кнопку отправки, чтобы отправить сообщение Recyclerview, которое находится в моем фрагменте, «прыгает» наверх, вместо того, чтобы оставаться фиксированным при последнем отправленном сообщении. Я предполагаю, что это связано с настройкой адаптера после вызова моего ValueEventListener, но я не уверен, как этого избежать. Есть предложения?
public class ChatFragment extends Fragment {
private static final String TAG = "ChatFragment";
private DatabaseReference databaseReference;
private FragmentChatBinding binding;
private ArrayList<Message> messageArrayList = new ArrayList<>();
private MessageAdapter adapter;
private RecyclerView recyclerView;
public ChatFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// inflate layout
binding = FragmentChatBinding.inflate(inflater, container, false);
// store root view
View view = binding.getRoot();
recyclerView = view.findViewById(R.id.recyclerview_message_list);
// get instance of firebase database node "message"
databaseReference = FirebaseDatabase.getInstance().getReference("message");
binding.buttonChatboxSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessageToDb();
}
});
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
binding.recyclerviewMessageList.setLayoutManager(layoutManager);
setChatListener();
// return root view
return view;
}
/*
Sets listener for chat fragment
*/
private void setChatListener() {
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
messageArrayList.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Message message = snapshot.getValue(Message.class);
messageArrayList.add(message);
}
adapter = new MessageAdapter(messageArrayList);
recyclerView.setAdapter(adapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
databaseReference.addValueEventListener(listener);
}