Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将多个Firestore集合中的数据提取到一个RecyclerView中?_Java_Android_Xml_Firebase_Google Cloud Firestore - Fatal编程技术网

Java 如何将多个Firestore集合中的数据提取到一个RecyclerView中?

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.

这是我的送货申请表,我正在将送货员的入住和退房位置保存到Firestore中,并在送货员送货和退房时加上时间戳。 这是我的代码,这是我将数据显示到recyclerView类中的代码,在该类中,我将在一个CardView中显示签入和签出数据。 这是我的java类

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()两个查询的结果,并将它们保存到一个类型的对象中,然后简单地使用,正如我在以下帖子中的回答所述:

在这种情况下,您将失去Firebase UI的功能。这不是完美的,但它会成功的

第二种方法是复制数据,这意味着您可以创建一个新集合,其中包含两个集合中的文档,然后将“CollectionReference”对象传递给FirestoreRecyclerOptions的“setQuery()”方法

这种技术被称为“非规范化”,在Firebase中非常常见。因此,我们经常在NoSQL数据库中复制数据,以适应其他情况下可能无法实现的查询。为了更好地理解,我建议您观看此视频。它适用于Firebase实时数据库,但同样的原则也适用于云Firestore

有关更多信息,请查看我在以下帖子中的答案:

    • 你看到了吗

    • 第一种方法:这里它在构造函数中得到两个列表。它会依次显示列表。但是如果您想在RecyclerView中以按时间排序的列表的形式显示数据,我建议您使用第二种方法

    • 第二种方法:按Asc或Dec顺序按时间混合这些签入和签出列表,创建一个单独的排序列表。并将其轻松地传递到适配器


    • 这些是你可以处理它的方法。如果有任何问题,请再次询问。

      是否要在单个RecyclerView中显示签入和签出数据?是的,签入和签出都是不同的集合,但包含在名为UserID(auth id)的同一集合中,我想把这两个结果都显示在一个recyclerView中。谢谢你,但是你能给我一个提示代码吗?你应该根据a中的信息进行自己的尝试