Firebase Firestore仅显示本地数据?
我有一个android应用程序的Java代码,它将问题保存在firestore数据库中。当我从仿真器保存数据时,它会被添加到数据库中,并且只显示在该仿真器设备中。当我用我的物理设备运行同一个应用程序时,它不会显示任何数据,尽管firestore有一些数据。此外,如果我使用我的物理设备添加数据,它只显示该设备中的数据,而模拟器设备不显示任何内容。请帮帮我。我正在使用RecyclerView显示数据 这是我的片段类 问题适配器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.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>