[英]Query Firestore For Items To Be Displayed using RecyclerView in Recyclerview
[英]Data from Firestore is not displayed in RecyclerView
我遇到了一個問題,我的代碼沒有顯示任何錯誤,但數據不會出現在 RecyclerView 中。 每次我運行它時,它都會在 RecyclerView 部分顯示為空白。 我已將我的數據庫規則設置為allow read, write: if true;
但仍然沒有工作。
這是 Java 代碼:
public class diary_user extends AppCompatActivity {
RecyclerView recyclerView;
Adapter adapter;
ImageView add;
DrawerLayout drawerLayout;
NavigationView navigationView;
Toolbar toolbar;
TextView date, note, time;
FirestoreRecyclerAdapter adapters;
FirebaseFirestore fStore;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_diary_user);
date = findViewById(R.id.date_text);
time = findViewById(R.id.time_text);
note = findViewById(R.id.note_textview);
recyclerView = findViewById(R.id.recycleView1);
fStore = FirebaseFirestore.getInstance();
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
final String current = user.getUid();
Query query = fStore.collection("Diary").whereEqualTo("UID",current);
FirestoreRecyclerOptions<ModelClass> options = new FirestoreRecyclerOptions.Builder<ModelClass>()
.setQuery(query, ModelClass.class)
.build();
adapters = new FirestoreRecyclerAdapter<ModelClass, ModelViewHolder>(options) {
@NonNull
@Override
public ModelViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_diary, parent,
false);
return new ModelViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull ModelViewHolder holder, int position, @NonNull
ModelClass model) {
holder.date.setText(model.getDate());
holder.note.setText(model.getText());
holder.time.setText(model.getTime());
holder.divider.setText(model.getDivider());
}
};
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapters);
}
private class ModelViewHolder extends RecyclerView.ViewHolder {
TextView date, time, note, divider;
public ModelViewHolder(@NonNull View itemView) {
super(itemView);
date = itemView.findViewById(R.id.date_text);
time = itemView.findViewById(R.id.time_text);
note = itemView.findViewById(R.id.note_textview);
divider = itemView.findViewById(R.id.line_textview);
}
}
@Override
protected void onStop() {
super.onStop();
if(adapters != null) {
adapters.stopListening();
}
}
@Override
protected void onStart() {
super.onStart();
if(adapters != null) {
adapters.startListening();
}
}
}
模型類代碼:
public class ModelClass {
String date,time,text,divider;
ModelClass(String date,String time,String text,String divider){
this.date = date;
this.time = time;
this.text = text;
this.divider = divider;
}
public String getDate() {
return date;
}
public String getTime() {
return time;
}
public String getText() {
return text;
}
public String getDivider() {
return divider;
}
}
XML 代碼:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="#ffffff">
<TextView
android:id="@+id/date_text"
android:layout_width="120dp"
android:layout_height="30dp"
android:layout_marginLeft="30dp"
android:layout_marginTop="20dp"
android:text="16/3/2021"
android:textColor="#000000"
android:textSize="20sp" />
<TextView
android:id="@+id/time_text"
android:layout_width="80dp"
android:layout_height="30dp"
android:layout_marginLeft="290dp"
android:layout_marginTop="20dp"
android:text="1:30PM"
android:textSize="14sp" />
<TextView
android:id="@+id/note_textview"
android:layout_width="200dp"
android:layout_height="30dp"
android:layout_marginLeft="30dp"
android:layout_marginTop="55dp"
android:text="Feeling good today"
android:textSize="16sp" />
<TextView
android:id="@+id/line_textview"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_below="@+id/time_text"
android:layout_marginLeft="30dp"
android:layout_marginTop="25dp"
android:text="_____________________________________________"
android:textColor="#CDC7C7"
android:textSize="16sp" />
</RelativeLayout>
添加adapters.startListening();
下面提到的這條線
adapters.startListening();
recyclerView.setHasFixedSize(true);
還要檢查 Firestore 規則
allow read, write : if true;
還要檢查數據收集字段名稱和您的 model class 變量名稱,或者您可以使用您的 anotaion
@PropertyName("Date")
我已將我的數據庫規則設置為允許讀取,寫入:如果為真; 但仍然沒有工作。
如果你設置:
allow read, write: if true;
在您的安全規則中,這意味着您允許在 Cloud Firestore 數據庫中執行讀取和寫入操作。 但這不是您的 RecylerView 為空的原因。 當您嘗試將 Firestore 中的文檔 map 轉換為“ModelClass”的 object 時,class 中存在的字段名稱必須與數據庫中存在的屬性名稱相匹配。 不幸的是,在您的情況下,這些字段不匹配。 看,您的 class 中的字段以小寫字母開頭,而在數據庫中以大寫字母開頭,這是不正確的。
為了解決這個問題,您有兩個選擇,您可以更改數據庫中的屬性名稱以匹配 class 中的名稱,或者您可以在 getter 前面使用注釋。 例如,如果您有一個名為“date”的字段,並且數據庫中的屬性名為“Date”(大寫 D),那么您的 getter 應如下所示:
@PropertyName("Date")
public String getDate() {
return date;
}
通過這種方式,您告訴編譯器查找名為“Date”而不是“date”的屬性。
因為您使用的是公共 getter,所以不要忘記將 class 中的字段設置為私有。 例如,如果您想讓它們公開,則不需要吸氣劑。 您可以直接在公共字段上設置值。 因此,最小的 class 聲明可能如下所示:
public class ModelClass {
public String date, time, text, divider;
}
另請注意,也不需要公共無參數構造函數,因為它是由編譯器提供的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.