android - RecyclerView not scrolling with firebase
问题描述
I'm making a chat application that uses Firebase as a backend, but I'm having trouble getting the RecyclerView to scroll to the bottom of the list. I have a chatActivity that has the following methods:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
Id = getIntent().getExtras().getString("matchId");
Pic = findViewById(R.id.displayImageMessages);
thoughtButton = findViewById(R.id.messageThought);
//SET MENU
menuButton = findViewById(R.id.messageMenu);
menuButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
optionMenu = new PopupMenu(ChatActivity.this,menuButton);
optionMenu.getMenuInflater().inflate(R.menu.popup_menu2,optionMenu.getMenu());
optionMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
if(menuItem.getItemId() == R.id.one){
backtoMain();
return true;
}
else if (menuItem.getItemId() == R.id.two){
return true;
}
else if(menuItem.getItemId() == R.id.three){
FirebaseAuth auth = FirebaseAuth.getInstance();
auth.signOut();
backtoMenu();
return true;
}
else{
return false;
}
}
});
optionMenu.show();
}
});
Button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
//LOAD PICTURE
URI = getIntent().getExtras().getString("displayPic");
Glide.with(this).load(URI).thumbnail(0.4f).into(Pic);
//RETRIEVE CHAT
currentUserID = FirebaseAuth.getInstance().getCurrentUser().getUid();
databaseUser = FirebaseDatabase.getInstance().getReference().child("users").child(currentUserID).child("connections").child(Id).child("ChatId");
databaseChat = FirebaseDatabase.getInstance().getReference().child("chat");
getChatId();
mSendEditText = findViewById(R.id.messageText);
mSendButton = findViewById(R.id.send);
mSendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sendMessage();
}
});
mRecyclerView = (RecyclerView) findViewById(R.id.ChatRecycler);
mRecyclerView.setNestedScrollingEnabled(true);
mRecyclerView.setHasFixedSize(false);
linearLayoutManager = new LinearLayoutManager(ChatActivity.this);
mChatLayoutManager = linearLayoutManager;
mRecyclerView.setLayoutManager(mChatLayoutManager);
mChatAdapter = new ChatViewAdapter(getDataSetChat(),ChatActivity.this);
mRecyclerView.setAdapter(mChatAdapter);
mRecyclerView.addItemDecoration(new VerticalSpaceItemDecoration(20));
}
and
private void getChatId() {
databaseUser.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
chatId = dataSnapshot.getValue().toString();
databaseChat = databaseChat.child(chatId);
getChatMessages();
linearLayoutManager.scrollToPositionWithOffset(resultsChat.size(),0);
Log.d("messageTAG",String.valueOf(mChatAdapter.getItemCount()));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
and
private void getChatMessages() {
databaseChat.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
if (dataSnapshot.exists()){
String message = null;
String createdbyuser = null;
long timestamp = 0;
if (dataSnapshot.child("text").getValue()!=null){
message = dataSnapshot.child("text").getValue().toString();
}
if (dataSnapshot.child("createdBy").getValue()!=null){
createdbyuser = dataSnapshot.child("createdBy").getValue().toString();
}
if (dataSnapshot.child("timestamp").getValue()!=null){
timestamp = Long.valueOf(dataSnapshot.child("timestamp").getValue().toString());
}
if (message!=null&&createdbyuser!=null){
Boolean currentUserBoolean = false;
if (createdbyuser.equals(currentUserID)){
currentUserBoolean = true;
}
ChatObject newMessage = new ChatObject(message,currentUserBoolean,timestamp);
resultsChat.add(newMessage);
mChatAdapter.notifyDataSetChanged();
}
//SETS VISABILITY OF THOUGHTS BUTTON IF CHAT SIZE IS ABOVE 10
if(resultsChat.size() > 10){
thoughtButton.setVisibility(View.VISIBLE);
}
}
}
I've tried various layoutManager.ScrollToPosition or adapter.ScrollToPosition etc, but I'd appreciate any thoughts you have on this problem?
解决方案
Try using
mRecyclerView.scrollToPosition(resultsChat.size() - 1);
In databaseChat.addChildEventListener()
Like this :
ChatObject newMessage = new ChatObject(message,currentUserBoolean,timestamp);
resultsChat.add(newMessage);
mRecyclerView.scrollToPosition(resultsChat.size() - 1); //here
mChatAdapter.notifyDataSetChanged();
推荐阅读
- pytorch - CoreML:为 ONNX RandomNormal 创建自定义层
- python-3.x - 我试图在 if 语句发生后让图像保持更长时间
- java - 比较两个字符串,都用正则表达式
- android - 一旦在画布上绘制矩形,你能改变它的颜色吗?
- javascript - 使用ajax和python发送文件后从外部url获取数据
- c# - 在多线程环境中使用 Newtonsoft.Json.JsonConverter
- c - 如何使用 sigaction()?结构 sigaction 未定义
- python - flask-marshmallow 定义模式以将简单的 json 转换为复杂的 orm
- sql - 在整个数据库中搜索连接的字符串
- android - Android Pie 9.0 将用户带到通知中心