簡體   English   中英

來自 Firestore 的數據未顯示在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM