Java 如何将多个Firestore集合中的数据提取到一个RecyclerView中?
这是我的送货申请表,我正在将送货员的入住和退房位置保存到Firestore中,并在送货员送货和退房时加上时间戳。 这是我的代码,这是我将数据显示到recyclerView类中的代码,在该类中,我将在一个CardView中显示签入和签出数据。 这是我的java类Java 如何将多个Firestore集合中的数据提取到一个RecyclerView中?,java,android,xml,firebase,google-cloud-firestore,Java,Android,Xml,Firebase,Google Cloud Firestore,这是我的送货申请表,我正在将送货员的入住和退房位置保存到Firestore中,并在送货员送货和退房时加上时间戳。 这是我的代码,这是我将数据显示到recyclerView类中的代码,在该类中,我将在一个CardView中显示签入和签出数据。 这是我的java类 package com.example.location.Activites; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.
package com.example.location.Activites;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.example.location.AdapterClass.AdapterClass;
import com.example.location.AdapterClass.CheckOutAdapterClass;
import com.example.location.ModelClasses.DataModelClass;
import com.example.location.R;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;
public class LastVisitedLocationActivity extends AppCompatActivity {
private FirebaseFirestore db = FirebaseFirestore.getInstance();
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
String userID = mUser.getUid();
private CollectionReference collectionReference = db.collection("UserLocation").document(userID).collection("CheckIn");
private CollectionReference collectionReference1= db.collection("UserLocation").document(userID).collection("CheckOut");
private RecyclerView recyclerView ;
private AdapterClass adapterClass;
private CheckOutAdapterClass checkOutAdapterClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_last_visited_location);
recyclerView = findViewById(R.id.RecyclerView);
setupRecyclerView();
setupRecyclerView1();
}
private void setupRecyclerView() {
Query query1 = collectionReference.orderBy("timestamp",Query.Direction.DESCENDING);
FirestoreRecyclerOptions<DataModelClass> options = new FirestoreRecyclerOptions.Builder<DataModelClass>()
.setQuery(query1,DataModelClass.class).build();
adapterClass = new AdapterClass(options);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapterClass);
}
private void setupRecyclerView1() {
Query query2 = collectionReference1.orderBy("timestamp");
FirestoreRecyclerOptions<DataModelClass> options = new FirestoreRecyclerOptions.Builder<DataModelClass>()
.setQuery(query2,DataModelClass.class).build();
checkOutAdapterClass = new CheckOutAdapterClass(options);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(checkOutAdapterClass);
}
@Override
protected void onStart() {
super.onStart();
adapterClass.startListening();
checkOutAdapterClass.startListening();
}
@Override
protected void onStop() {
super.onStop();
adapterClass.stopListening();
checkOutAdapterClass.stopListening();
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/item_linerLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="2dp">
<androidx.cardview.widget.CardView
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="5dp"
android:layout_marginBottom="5dp"
app:cardCornerRadius="10dp"
app:cardElevation="10dp"
app:strokeColor="@color/white"
app:strokeWidth="2dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="6dp">
<TextView
android:id="@+id/recycler_CheckInlatitudeLongitude"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="2dp"
android:fontFamily="@font/amarante"
android:paddingStart="15dp"
android:paddingTop="10dp"
android:paddingEnd="15dp"
android:paddingBottom="10dp"
android:text="Latitude and Longitude"
android:textColor="@color/black"
android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<TextView
android:id="@+id/recyclerView_CheckIndateAndTime"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="2dp"
android:fontFamily="@font/amarante"
android:paddingStart="15dp"
android:paddingTop="10dp"
android:paddingEnd="15dp"
android:paddingBottom="10dp"
android:text="Date and time"
android:textColor="@color/black"
android:textSize="14sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/recycler_CheckInlatitudeLongitude"
app:layout_constraintTop_toBottomOf="@+id/recycler_CheckInlatitudeLongitude" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="2dp"
android:layout_marginTop="8dp"
android:text="Check-In"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/recycler_CheckInlatitudeLongitude"
app:layout_constraintTop_toTopOf="parent"
tools:text="Check-In" />
<TextView
android:id="@+id/recycler_CheckOutlatitudeLongitude"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="2dp"
android:fontFamily="@font/amarante"
android:paddingStart="15dp"
android:paddingTop="10dp"
android:paddingEnd="15dp"
android:paddingBottom="10dp"
android:text="Latitude and Longitude"
android:textColor="@color/black"
android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView3" />
<TextView
android:id="@+id/recyclerView_CheckOutdateAndTime"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="2dp"
android:fontFamily="@font/amarante"
android:paddingStart="15dp"
android:paddingTop="10dp"
android:paddingEnd="15dp"
android:paddingBottom="10dp"
android:text="Date and time"
android:textColor="@color/black"
android:textSize="14sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/recycler_CheckInlatitudeLongitude"
app:layout_constraintTop_toBottomOf="@+id/recycler_CheckOutlatitudeLongitude" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Check-out"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.006"
app:layout_constraintStart_toStartOf="@+id/recycler_CheckOutlatitudeLongitude"
app:layout_constraintTop_toBottomOf="@+id/recyclerView_CheckIndateAndTime"
tools:text="Check-Out" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</RelativeLayout>
package com.example.location.Activites;
导入androidx.appcompat.app.appcompat活动;
导入androidx.recyclerview.widget.LinearLayoutManager;
导入androidx.recyclerview.widget.recyclerview;
导入android.os.Bundle;
导入com.example.location.AdapterClass.AdapterClass;
导入com.example.location.AdapterClass.CheckOutAdapterClass;
导入com.example.location.ModelClasses.DataModelClass;
导入com.example.location.R;
导入com.firebase.ui.firestore.FirestoreRecyclerOptions;
导入com.google.firebase.auth.FirebaseAuth;
导入com.google.firebase.auth.FirebaseUser;
导入com.google.firebase.firestore.CollectionReference;
导入com.google.firebase.firestore.FirebaseFirestore;
导入com.google.firebase.firestore.Query;
公共类LastVisitedLocationActivity扩展了AppCompativeActivity{
私有FirebaseFirestore db=FirebaseFirestore.getInstance();
FirebaseUser mUser=FirebaseAuth.getInstance().getCurrentUser();
字符串userID=mUser.getUid();
private CollectionReference CollectionReference=db.collection(“UserLocation”).document(userID.collection(“CheckIn”);
private CollectionReference collectionReference1=db.collection(“UserLocation”).document(userID).collection(“CheckOut”);
私人回收站;
私有适配器类适配器类;
私有签出适配器类签出适配器类;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u last\u visited\u location);
recyclerView=findViewById(R.id.recyclerView);
setupRecyclerView();
setupRecycleServiceW1();
}
私有void setupRecyclerView(){
Query query1=collectionReference.orderBy(“timestamp”,Query.Direction.DESCENDING);
FirestoreRecyclerOptions选项=新建FirestoreRecyclerOptions.Builder()
.setQuery(query1,DataModelClass.class).build();
适配器类=新适配器类(选项);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(新的LinearLayoutManager(本));
recyclerView.setAdapter(适配器类);
}
私有void setupRecycleServiceW1(){
查询query2=collectionReference1.orderBy(“时间戳”);
FirestoreRecyclerOptions选项=新建FirestoreRecyclerOptions.Builder()
.setQuery(query2,DataModelClass.class).build();
checkOutAdapterClass=新的checkOutAdapterClass(选项);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(新的LinearLayoutManager(本));
recyclerView.setAdapter(checkOutAdapterClass);
}
@凌驾
受保护的void onStart(){
super.onStart();
adapterClass.startListening();
checkOutAdapterClass.startListening();
}
@凌驾
受保护的void onStop(){
super.onStop();
adapterClass.stopListening();
checkOutAdapterClass.stopListening();
}
}
这是我的xml类
package com.example.location.Activites;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import com.example.location.AdapterClass.AdapterClass;
import com.example.location.AdapterClass.CheckOutAdapterClass;
import com.example.location.ModelClasses.DataModelClass;
import com.example.location.R;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;
public class LastVisitedLocationActivity extends AppCompatActivity {
private FirebaseFirestore db = FirebaseFirestore.getInstance();
FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser();
String userID = mUser.getUid();
private CollectionReference collectionReference = db.collection("UserLocation").document(userID).collection("CheckIn");
private CollectionReference collectionReference1= db.collection("UserLocation").document(userID).collection("CheckOut");
private RecyclerView recyclerView ;
private AdapterClass adapterClass;
private CheckOutAdapterClass checkOutAdapterClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_last_visited_location);
recyclerView = findViewById(R.id.RecyclerView);
setupRecyclerView();
setupRecyclerView1();
}
private void setupRecyclerView() {
Query query1 = collectionReference.orderBy("timestamp",Query.Direction.DESCENDING);
FirestoreRecyclerOptions<DataModelClass> options = new FirestoreRecyclerOptions.Builder<DataModelClass>()
.setQuery(query1,DataModelClass.class).build();
adapterClass = new AdapterClass(options);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapterClass);
}
private void setupRecyclerView1() {
Query query2 = collectionReference1.orderBy("timestamp");
FirestoreRecyclerOptions<DataModelClass> options = new FirestoreRecyclerOptions.Builder<DataModelClass>()
.setQuery(query2,DataModelClass.class).build();
checkOutAdapterClass = new CheckOutAdapterClass(options);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(checkOutAdapterClass);
}
@Override
protected void onStart() {
super.onStart();
adapterClass.startListening();
checkOutAdapterClass.startListening();
}
@Override
protected void onStop() {
super.onStop();
adapterClass.stopListening();
checkOutAdapterClass.stopListening();
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/item_linerLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="2dp">
<androidx.cardview.widget.CardView
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_marginTop="5dp"
android:layout_marginEnd="5dp"
android:layout_marginBottom="5dp"
app:cardCornerRadius="10dp"
app:cardElevation="10dp"
app:strokeColor="@color/white"
app:strokeWidth="2dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="6dp">
<TextView
android:id="@+id/recycler_CheckInlatitudeLongitude"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="2dp"
android:fontFamily="@font/amarante"
android:paddingStart="15dp"
android:paddingTop="10dp"
android:paddingEnd="15dp"
android:paddingBottom="10dp"
android:text="Latitude and Longitude"
android:textColor="@color/black"
android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<TextView
android:id="@+id/recyclerView_CheckIndateAndTime"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="2dp"
android:fontFamily="@font/amarante"
android:paddingStart="15dp"
android:paddingTop="10dp"
android:paddingEnd="15dp"
android:paddingBottom="10dp"
android:text="Date and time"
android:textColor="@color/black"
android:textSize="14sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/recycler_CheckInlatitudeLongitude"
app:layout_constraintTop_toBottomOf="@+id/recycler_CheckInlatitudeLongitude" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="2dp"
android:layout_marginTop="8dp"
android:text="Check-In"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/recycler_CheckInlatitudeLongitude"
app:layout_constraintTop_toTopOf="parent"
tools:text="Check-In" />
<TextView
android:id="@+id/recycler_CheckOutlatitudeLongitude"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="2dp"
android:fontFamily="@font/amarante"
android:paddingStart="15dp"
android:paddingTop="10dp"
android:paddingEnd="15dp"
android:paddingBottom="10dp"
android:text="Latitude and Longitude"
android:textColor="@color/black"
android:textSize="14sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView3" />
<TextView
android:id="@+id/recyclerView_CheckOutdateAndTime"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="2dp"
android:fontFamily="@font/amarante"
android:paddingStart="15dp"
android:paddingTop="10dp"
android:paddingEnd="15dp"
android:paddingBottom="10dp"
android:text="Date and time"
android:textColor="@color/black"
android:textSize="14sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/recycler_CheckInlatitudeLongitude"
app:layout_constraintTop_toBottomOf="@+id/recycler_CheckOutlatitudeLongitude" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Check-out"
android:textSize="18sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.006"
app:layout_constraintStart_toStartOf="@+id/recycler_CheckOutlatitudeLongitude"
app:layout_constraintTop_toBottomOf="@+id/recyclerView_CheckIndateAndTime"
tools:text="Check-Out" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</RelativeLayout>
因此进入firestore的数据如下所示:-
userLocation(集合)-->userAuthID(文档)-->CheckIn(集合)-->我在这里保存签入的位置
签出(收集)-->我在这里保存签出的位置。您无法将两个不同的查询“collectionReference”和“collectionReference1”传递给“FirestoreRecyclerOptions”的单个实例,只允许一个查询。有两种方法可以解决这个问题。第一种解决方案是get()两个查询的结果,并将它们保存到一个类型的对象中,然后简单地使用,正如我在以下帖子中的回答所述:
- 第一种方法:这里它在构造函数中得到两个列表。它会依次显示列表。但是如果您想在RecyclerView中以按时间排序的列表的形式显示数据,我建议您使用第二种方法
- 第二种方法:按Asc或Dec顺序按时间混合这些签入和签出列表,创建一个单独的排序列表。并将其轻松地传递到适配器
- 你看到了吗
这些是你可以处理它的方法。如果有任何问题,请再次询问。是否要在单个RecyclerView中显示签入和签出数据?是的,签入和签出都是不同的集合,但包含在名为UserID(auth id)的同一集合中,我想把这两个结果都显示在一个recyclerView中。谢谢你,但是你能给我一个提示代码吗?你应该根据a中的信息进行自己的尝试