Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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
Firebase Firestore仅显示本地数据?_Firebase_Android Studio_Google Cloud Firestore_Android Recyclerview - Fatal编程技术网

Firebase Firestore仅显示本地数据?

Firebase Firestore仅显示本地数据?,firebase,android-studio,google-cloud-firestore,android-recyclerview,Firebase,Android Studio,Google Cloud Firestore,Android Recyclerview,我有一个android应用程序的Java代码,它将问题保存在firestore数据库中。当我从仿真器保存数据时,它会被添加到数据库中,并且只显示在该仿真器设备中。当我用我的物理设备运行同一个应用程序时,它不会显示任何数据,尽管firestore有一些数据。此外,如果我使用我的物理设备添加数据,它只显示该设备中的数据,而模拟器设备不显示任何内容。请帮帮我。我正在使用RecyclerView显示数据 这是我的片段类 问题适配器 导入android.view.LayoutInflater; 导入an

我有一个android应用程序的Java代码,它将问题保存在firestore数据库中。当我从仿真器保存数据时,它会被添加到数据库中,并且只显示在该仿真器设备中。当我用我的物理设备运行同一个应用程序时,它不会显示任何数据,尽管firestore有一些数据。此外,如果我使用我的物理设备添加数据,它只显示该设备中的数据,而模拟器设备不显示任何内容。请帮帮我。我正在使用RecyclerView显示数据

这是我的片段类

问题适配器


导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.TextView;
导入androidx.annotation.NonNull;
导入androidx.recyclerview.widget.recyclerview;
导入com.firebase.ui.firestore.FirestoreRecyclerAdapter;
导入com.firebase.ui.firestore.FirestoreRecyclerOptions;
导入com.google.firebase.firestore.DocumentSnapshot;
公共类QuestionAdapter扩展FirestoreRecyclerAdapter{
私人监听;
公共问题适配器(@NonNull FirestoreRecyclerOptions选项){
超级(期权);
}
@凌驾
受保护的无效onBindViewHolder(@NonNull questionsViewholder holder,int位置,@NonNull Question model){
holder.studentID.setText(model.getStudentID());
holder.question.setText(model.getQuestion());
holder.department.setText(model.getDepartment());
}
公共问题viewholder onCreateViewHolder(@NonNull ViewGroup父级,int viewType)
{
View=LayoutFlater.from(parent.getContext()).flate(R.layout.question_项,parent,false);
返回新问题查看者(视图);
}
公共类问题ViewHolder扩展了RecyclerView.ViewHolder{
TextView学生ID、问题、部门;
公共问题查看文件夹(@NonNull View itemView){
超级(项目视图);
studentID=itemView.findViewById(R.id.question\u item\u studentID);
question=itemView.findviewbyd(R.id.question\u item\u question);
department=itemView.findviewbyd(R.id.question\u item\u dep);
itemView.setOnClickListener(v->{
int position=getAdapterPosition();
if(position!=RecyclerView.NO_position&&listener!=null){
onItemClick(getSnapshots().getSnapshot(position),position);
}
});
}
}
公共接口侦听器{
void onItemClick(DocumentSnapshot DocumentSnapshot,int位置);
}
public void setItemClickListener(onItemClickListener侦听器){
this.listener=listener;
}
}
添加问题类


导入android.content.Intent;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.Spinner;
导入android.widget.Toast;
导入androidx.annotation.NonNull;
导入androidx.appcompat.app.appcompat活动;
导入androidx.appcompat.widget.Toolbar;
导入com.google.android.gms.tasks.OnFailureListener;
导入com.google.android.gms.tasks.OnSuccessListener;
导入com.google.firebase.firestore.CollectionReference;
导入com.google.firebase.firestore.DocumentReference;
导入com.google.firebase.firestore.FirebaseFirestore;
导入java.sql.Timestamp;
公共类AddQuestion扩展了AppCompative活动{
工具栏;
纺纱机;
编辑文本输入;
按钮addbtn;
FirebaseFirestore firebaseDb;
CollectionReference CollectionReference;
问题;;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.add_-question);
toolbar=findviewbyd(R.id.toolbar);
toolbar.setTitle(“添加问题”);
设置支持操作栏(工具栏);
//下拉列表
微调器=findViewById(R.id.addQuestionBTNSPINER);
ArrayAdapter=ArrayAdapter.createFromResource(此项为R.array.departments,R.layout.spinner_项);
setDropDownViewResource(android.R.layout.simple\u微调器\u下拉菜单\u项);
旋转器。设置适配器(适配器);
//spinner.setOnItemClickListener((AdapterView.OnItemClickListener)this);
questionInput=findViewById(R.id.editTextAddQuestion);
addbtn=findviewbyd(R.id.addQuestionbtn);
firebaseDb=FirebaseFirestore.getInstance();
collectionReference=firebaseDb.collection(“问题”);
}//onCreate方法
公共问题(视图){
字符串que=questionInput.getText().toString();
String dep=spinner.getSelectedItem().toString();
Timestamp Timestamp=新的时间戳(System.currentTimeMillis());
if(que.isEmpty()){
Toast.makeText(AddQuestion.this,“问题是必需的”,Toast.LENGTH_LONG.show();
}否则{
问题=新问题(“IT19951386”,que,dep,timestamp.toString());
collectionReference.add(问题).addOnSuccessListener(新OnSuccessListener(){
@凌驾
成功时公共无效(文档引用文档引用){
Toast.makeText(AddQuestion.this,“问题添加成功”,Toast.LENGTH_LONG.show();
意向意向=新意向(AddQuestion.this,Home.class);
星触觉(意向);
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Toast.makeText(AddQuestion.this,“添加问题失败!”,Toast.LENGTH_LONG.show();
}
});
}
}
}
我的frgament类的xml



import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.android.material.button.MaterialButtonToggleGroup;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;


/**
 * A simple {@link Fragment} subclass.
 * Use the {@link QandA#newInstance} factory method to
 * create an instance of this fragment.
 */
public class QandA extends Fragment {
    FloatingActionButton fltBtn;
    MaterialButtonToggleGroup materialButtonToggleGroup;
    RecyclerView recyclerView;

    private FirebaseFirestore firebaseDb = FirebaseFirestore.getInstance();
    private CollectionReference collectionReference = firebaseDb.collection("Questions");
    private QuestionAdapter questionAdapter;
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    public QandA() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment QandA.
     */
    // TODO: Rename and change types and number of parameters
    public static QandA newInstance(String param1, String param2) {
        QandA fragment = new QandA();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.fragment_qand_a, null);
        fltBtn = root.findViewById(R.id.addQFltBtn);
        fltBtn.setOnClickListener( v -> {
            Intent intent = new Intent(getActivity() ,AddQuestion.class);
            startActivity(intent);
        });
        recyclerView = root.findViewById(R.id.Questions_recyclerview);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

        firebaseDb = FirebaseFirestore.getInstance();
        collectionReference = firebaseDb.collection("Questions");
        fetchData("All");//to initial load the data

        //
        materialButtonToggleGroup = root.findViewById(R.id.materialButtonToggleGroup);
        materialButtonToggleGroup.setSelectionRequired(true);
        materialButtonToggleGroup.addOnButtonCheckedListener((group, checkedId, isChecked) -> {
            if(isChecked){
                if(checkedId == R.id.allBtn){
                    fetchData("All");
                }
                if(checkedId == R.id.myQBtn){
                    fetchData("My Questions");
                }
            }
        });
        //
        return root;
    }
    public void fetchData(String type){
        if(type.equals("All")){
            Toast.makeText(getContext(), "All", Toast.LENGTH_LONG).show();
            Query query = collectionReference.orderBy("studentID").whereNotEqualTo("studentID","IT19951386").orderBy("timestamp", Query.Direction.DESCENDING);

            FirestoreRecyclerOptions<Question> options = new FirestoreRecyclerOptions.Builder<Question>()
                    .setQuery(query, Question.class)
                    .build();

            questionAdapter = new QuestionAdapter(options);
            // Connecting Adapter class with the Recycler view*/
            recyclerView.setAdapter(questionAdapter);
            questionAdapter.startListening();
            questionAdapter.setItemClickListener(new QuestionAdapter.onItemClickListener() {
                @Override
                public void onItemClick(DocumentSnapshot documentSnapshot, int position) {
                    String id = documentSnapshot.getId();
                    Intent intent = new Intent(getActivity(), SubmitAnswers.class);
                    intent.putExtra("qID",id);
                    //Toast.makeText(getActivity(), " "+ id, Toast.LENGTH_LONG).show();
                    startActivity(intent);
                }
            });
        }
        if(type == "My Questions"){
            Toast.makeText(getContext(), "My Questions", Toast.LENGTH_LONG).show();
            Query query = collectionReference.orderBy("timestamp",Query.Direction.DESCENDING).whereEqualTo("studentID","IT19951386");

            FirestoreRecyclerOptions<Question> options = new FirestoreRecyclerOptions.Builder<Question>()
                    .setQuery(query, Question.class)
                    .build();

            questionAdapter = new QuestionAdapter(options);
            // Connecting Adapter class with the Recycler view*/
            recyclerView.setAdapter(questionAdapter);
            questionAdapter.startListening();
            questionAdapter.setItemClickListener(new QuestionAdapter.onItemClickListener() {
                @Override
                public void onItemClick(DocumentSnapshot documentSnapshot, int position) {
                    String id = documentSnapshot.getId();
                    Intent intent = new Intent(getActivity(), Answers.class);
                    intent.putExtra("qID",id);
                    startActivity(intent);
                }
            });

        }
    }//to fetch data according to the all or my questions
    
}

public class Question {
    private String studentID;
    private String question;
    private String department;
    private String timestamp;

    public Question(){

    }

    public Question(String studentID, String question, String department, String timestamp) {
        this.studentID = studentID;
        this.question = question;
        this.department = department;
        this.timestamp = timestamp;
    }
    //getters and setters
    public String getQuestion() {
        return question;
    }

    public void setQuestion(String question) {
        this.question = question;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public String getStudentID() {
        return studentID;
    }

    public void setStudentID(String studentID) {
        this.studentID = studentID;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }
}

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.firebase.ui.firestore.FirestoreRecyclerAdapter;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.firebase.firestore.DocumentSnapshot;


public class QuestionAdapter extends FirestoreRecyclerAdapter <Question, QuestionAdapter.questionsViewholder> {
    private onItemClickListener listener;
    public QuestionAdapter(@NonNull FirestoreRecyclerOptions<Question> options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull questionsViewholder holder, int position, @NonNull Question model) {
        holder.studentID.setText(model.getStudentID());
        holder.question.setText(model.getQuestion());
        holder.department.setText(model.getDepartment());
    }

    public questionsViewholder onCreateViewHolder(@NonNull ViewGroup parent,int viewType)
    {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.question_item, parent, false);
        return new questionsViewholder(view);
    }

    public class questionsViewholder extends RecyclerView.ViewHolder{
        TextView studentID, question, department;
        public questionsViewholder(@NonNull View itemView) {
            super(itemView);
            studentID = itemView.findViewById(R.id.question_item_studentID);
            question = itemView.findViewById(R.id.question_item_question);
            department =itemView.findViewById(R.id.question_item_dep);

            itemView.setOnClickListener(v -> {
                int position = getAdapterPosition();
                if(position != RecyclerView.NO_POSITION && listener != null){
                    listener.onItemClick(getSnapshots().getSnapshot(position), position);
                }
            });
        }
    }
    public interface onItemClickListener{
        void onItemClick(DocumentSnapshot documentSnapshot, int position);
    }
    public void setItemClickListener(onItemClickListener listener){
        this.listener = listener;
    }
}

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.FirebaseFirestore;

import java.sql.Timestamp;


public class AddQuestion extends AppCompatActivity {
    Toolbar toolbar;
    Spinner spinner;
    EditText questionInput;
    Button addbtn;
    FirebaseFirestore firebaseDb;
    CollectionReference collectionReference;
    Question question;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_question);
        toolbar = findViewById(R.id.toolbar);
        toolbar.setTitle("Add a question");
        setSupportActionBar(toolbar);

        //dropdown
        spinner = findViewById(R.id.addQuestionbtnSpinner);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.departments, R.layout.spinner_item);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        //spinner.setOnItemClickListener((AdapterView.OnItemClickListener) this);

        questionInput= findViewById(R.id.editTextAddQuestion);
        addbtn = findViewById(R.id.addQuestionbtn);

        firebaseDb = FirebaseFirestore.getInstance();
        collectionReference = firebaseDb.collection("Questions");
    }//onCreate method

    public void addQuestion(View view) {
        String que = questionInput.getText().toString();
        String dep = spinner.getSelectedItem().toString();
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());

        if (que.isEmpty()) {
            Toast.makeText(AddQuestion.this, "Question is required", Toast.LENGTH_LONG).show();
        } else {
            Question question = new Question("IT19951386", que, dep, timestamp.toString());

            collectionReference.add(question).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                @Override
                public void onSuccess(DocumentReference documentReference) {
                    Toast.makeText(AddQuestion.this, "Question added successfully", Toast.LENGTH_LONG).show();
                    Intent intent = new Intent(AddQuestion.this, Home.class);
                    startActivity(intent);
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(AddQuestion.this, "Failed to add Question!", Toast.LENGTH_LONG).show();
                }
            });
        }
    }
}
<androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".QandA">
    <com.google.android.material.button.MaterialButtonToggleGroup
        android:id="@+id/materialButtonToggleGroup"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        app:checkedButton="@+id/allBtn"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:singleSelection="true">

        <Button
            android:id="@+id/allBtn"
            style="?attr/materialButtonOutlinedStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/All"
            android:textColor="@color/white" />

        <Button
            android:id="@+id/myQBtn"
            style="?attr/materialButtonOutlinedStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/My_Question"
            android:textColor="@color/white" />
    </com.google.android.material.button.MaterialButtonToggleGroup>


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/Questions_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginTop="7dp"
        android:layout_marginBottom="7dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/materialButtonToggleGroup"
        tools:layout_editor_absoluteX="0dp" />


    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/addQFltBtn"
        android:layout_width="56dp"
        android:layout_height="55dp"
        android:layout_marginEnd="18dp"
        android:layout_marginBottom="18dp"
        android:backgroundTint="@color/yellow"
        android:elevation="4dp"
        android:src="@drawable/ic_plus"
        android:visibility="visible"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:rippleColor="@color/black" />

</androidx.constraintlayout.widget.ConstraintLayout>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_marginTop="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginLeft="8dp"
    app:cardBackgroundColor="#1b3261"
    android:outlineAmbientShadowColor="@color/white">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="8dp">
        <TextView
            android:layout_width="wrap_content"
            android:textColor="@color/white"
            android:layout_height="wrap_content"
            android:text="ITXXXXXXXX"
            android:textStyle="bold"
            android:id="@+id/question_item_studentID"
            android:layout_toStartOf="@id/question_item_dep"
            android:layout_alignParentStart="true"
            />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/question_item_dep"
            android:textColor="@color/white"
            android:text="IT"
            android:textStyle="bold"
            android:layout_alignParentRight="true"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/question_item_question"
            android:textColor="@color/white"
            android:layout_below="@id/question_item_studentID"
            android:text="my question is ?"
            android:maxLines="5"
            android:ellipsize="end"/>



    </RelativeLayout>

</com.google.android.material.card.MaterialCardView>