Java 将新数据分页到firestore中的旧数据上
我正在构建一个聊天应用程序,并在对话屏幕中使用分页。首先,我加载了十条消息,最近一条来自firestore,接下来是10条,然后继续。当前10条消息加载到屏幕中时,接下来的10条消息加载到最近消息的下方,但我想在新消息上加载旧消息,这里是我的代码示例Java 将新数据分页到firestore中的旧数据上,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我正在构建一个聊天应用程序,并在对话屏幕中使用分页。首先,我加载了十条消息,最近一条来自firestore,接下来是10条,然后继续。当前10条消息加载到屏幕中时,接下来的10条消息加载到最近消息的下方,但我想在新消息上加载旧消息,这里是我的代码示例 toolbar =findViewById(R.id.toolbar5); toolbar.setTitle(""); setSupportActionBar(toolbar); Objects.req
toolbar =findViewById(R.id.toolbar5);
toolbar.setTitle("");
setSupportActionBar(toolbar);
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
sendBtn = findViewById(R.id.sendBtn);
textMsg = findViewById(R.id.txtMessage);
profileImg=findViewById(R.id.profile_imageChat);
userName = findViewById(R.id.userName);
userState = findViewById(R.id.userState);
refreshMessages = findViewById(R.id.refreshMessages);
mChat = new ArrayList<>();
firestore =FirebaseFirestore.getInstance();
auth =FirebaseAuth.getInstance();
docref = firestore.collection("users").document(getUser());
documentReference = firestore.collection("users").document(Objects.requireNonNull(auth.getCurrentUser()).getUid());
//setting up online and last seen status
docref.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@SuppressLint("SetTextI18n")
@Override
public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
if(e!=null)
Log.d("Event",e+"");
if(documentSnapshot != null){
if(documentSnapshot.getBoolean("state").equals(true))
userState.setText("Online");
else
userState.setText(documentSnapshot.getString("offlineDate"));
}
else
Log.d("Error","Null");
}
});
refreshMessages.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
recieveMessage(auth.getCurrentUser().getUid(),getUser());
}
});
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String message = textMsg.getText().toString().trim();
String sender=auth.getCurrentUser().getUid();
if (!message.isEmpty()){
//getting Current time
calendar=Calendar.getInstance();
@SuppressLint("SimpleDateFormat") SimpleDateFormat simpleDateFormat = new SimpleDateFormat("hh:mm a");
final String currentTime = simpleDateFormat.format(calendar.getTime());
//getting current everything
Calendar calendar2 = Calendar.getInstance();
@SuppressLint("SimpleDateFormat") SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
final String dateSet = simpleDateFormat1.format(calendar2.getTime());
sendMessage(sender,getUser(),message,currentTime,dateSet);
}
else
Toast.makeText(chatScreen.this, "Error", Toast.LENGTH_SHORT).show();
textMsg.setText("");
}
});
constraintLayout=findViewById(R.id.toolbarLayout);
constraintLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(getApplicationContext(), userProfile.class);
intent.putExtra("userid",getUser());
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(intent);
}
});
docref.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
userName.setText(documentSnapshot.getString("Name"));
recieveMessage(auth.getUid(),getUser());
//Do coding For image
storageReference = FirebaseStorage.getInstance().getReference();
final StorageReference profile = storageReference.child("users/"+getUser());
profile.getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
Picasso.get().load(task.getResult()).into(profileImg);
}
});
}
});
//messages recycler view
recyclerView =findViewById(R.id.recyclerSenderView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
toolbar=findviewbyd(R.id.toolbar5);
工具栏。设置标题(“”);
设置支持操作栏(工具栏);
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
toolbar.setNavigationOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
完成();
}
});
sendBtn=findviewbyd(R.id.sendBtn);
textMsg=findviewbyd(R.id.txtMessage);
profileImg=findviewbyd(R.id.profile\u imageChat);
userName=findviewbyd(R.id.userName);
userState=findviewbyd(R.id.userState);
refreshMessages=findViewById(R.id.refreshMessages);
mChat=newarraylist();
firestore=FirebaseFirestore.getInstance();
auth=FirebaseAuth.getInstance();
docref=firestore.collection(“用户”).document(getUser());
documentReference=firestore.collection(“用户”).document(Objects.requirennull(auth.getCurrentUser()).getUid());
//设置联机和上次看到的状态
docref.addSnapshotListener(新的EventListener(){
@SuppressLint(“SetTextI18n”)
@凌驾
public void OneEvent(@Nullable DocumentSnapshot DocumentSnapshot,@Nullable FirebaseFirestoreException e){
如果(e!=null)
Log.d(“事件”,e+);
如果(documentSnapshot!=null){
if(documentSnapshot.getBoolean(“state”).equals(true))
userState.setText(“在线”);
其他的
userState.setText(documentSnapshot.getString(“offlineDate”);
}
其他的
Log.d(“错误”、“空”);
}
});
refreshMessages.setOnRefreshListener(新的SwipeRefreshLayout.OnRefreshListener(){
@凌驾
公共void onRefresh(){
ReceiveMessage(auth.getCurrentUser().getUid(),getUser());
}
});
sendBtn.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
String message=textMsg.getText().toString().trim();
字符串发送者=auth.getCurrentUser().getUid();
如果(!message.isEmpty()){
//获取当前时间
calendar=calendar.getInstance();
@SuppressLint(“SimpleDataFormat”)SimpleDataFormat SimpleDataFormat=新SimpleDataFormat(“hh:mm a”);
最终字符串currentTime=SimpleDataFormat.format(calendar.getTime());
//了解最新的一切
Calendar calendar2=Calendar.getInstance();
@SuppressLint(“SimpleDataFormat”)SimpleDataFormat SimpleDataFormat1=新的SimpleDataFormat(“yyy-MM-dd'T'HH:MM:ss.SSSXXX”);
最终字符串dateSet=simpleDataFormat1.format(calendar2.getTime());
sendMessage(发送者,getUser(),消息,当前时间,日期集);
}
其他的
Toast.makeText(chatScreen.this,“Error”,Toast.LENGTH_SHORT.show();
textMsg.setText(“”);
}
});
constraintLayout=findViewById(R.id.toolbarLayout);
constraintLayout.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Intent Intent=新的Intent(getApplicationContext(),userProfile.class);
putExtra(“userid”,getUser());
intent.addFlags(intent.FLAG\u活动\u新任务);
getApplicationContext().startActivity(intent);
}
});
docref.get().addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公共无效(文档快照文档快照){
userName.setText(documentSnapshot.getString(“Name”);
接收消息(auth.getUid(),getUser());
//对图像进行编码
storageReference=FirebaseStorage.getInstance().getReference();
最终的StorageReference配置文件=StorageReference.child(“users/”+getUser());
profile.getDownloadUrl().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
Picasso.get().load(task.getResult()).into(profileImg);
}
});
}
});
//邮件回收器视图
recyclerView=findViewById(R.id.recyclerSenderView);
recyclerView.setHasFixedSize(true);
setLayoutManager(新的LinearLayoutManager(getApplicationContext());
这是我从onCreate调用的函数
private void recieveMessage(final String sender , final String reciever) {
colref = FirebaseFirestore.getInstance().collection("chats");
Query next;
if(lastVisible == null)
next = colref.orderBy("dateSet", Query.Direction.DESCENDING).limit(TOTAL_MESSAGES_TO_LOAD);
else
next = colref.orderBy("dateSet").limitToLast(TOTAL_MESSAGES_TO_LOAD).endBefore(lastVisible);
next.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
if(e!= null)
Log.d("onEvent", e+"");
if(queryDocumentSnapshots != null){
// mChat.clear();
//Load item first time
for (QueryDocumentSnapshot ds : queryDocumentSnapshots){
lastvisibleDoc.add(queryDocumentSnapshots.getDocuments().toString());
if(ds.getString("Reciever").equals(sender) && ds.getString("Sender").equals(reciever) ||
ds.getString("Reciever").equals(reciever) && ds.getString("Sender").equals(sender)){
mChat.add(new ChatModel(ds.getString("Sender"),ds.getString("Reciever"),ds.getString("Message"),ds.getString("Time")));
}
}
// Get the last visible document
if(queryDocumentSnapshots.size() > 0){
lastVisible = queryDocumentSnapshots.getDocuments().get(0);
Log.d("VisibleDoc",lastVisible+"");
lastvisibleDoc.clear();
Toast.makeText(chatScreen.this, "wrk", Toast.LENGTH_SHORT).show();
}
adapter = new messgaeAdapter(getApplicationContext(),mChat);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
recyclerView.scrollToPosition(mChat.size()-1);
refreshMessages.setRefreshing(false);
}
else
Log.d("Document","null");
}
});
}
private void receivemessage(最终字符串发送方,最终字符串接收方){
colref=FirebaseFirestore.getInstance()集合(“聊天”);
查询下一步;
if(lastVisible==null)
next=colref.orderBy(“日期集”,Query.Direction.DESCENDING).limit(总消息到负载);
其他的
next=colref.orderBy(“日期集”).limitToLast(从消息到加载的总数).endBefore(最后可见);
next.addSnapshotListener(新的EventListener(){
@凌驾
public void OneEvent(@Nullable QuerySnapshot queryDocumentSnapshots,@Nullable FirebaseFirestoreException e){
如果(e!=null)
Log.d(“onEvent”,e+);
if(queryDocumentSnapshots!=null){
//mChat.clear();
//首次加载项目
用于(QueryDocumentSnapshot ds:QueryDocumentSnapshot){
添加(queryDocumentSnapshots.getDocuments().toString());
if(ds.getString(“接收方”).equals(发送方)和&ds.getString(“发送方”).equals(接收方)||
getString(“receiver”)。
// mChat.clear();
adapter = new messageAdapter(getApplicationContext(),mChat);
recyclerView.setAdapter(adapter);