【发布时间】:2020-06-24 18:09:06
【问题描述】:
我正在关注this tutorial,据此,当我启动我的应用程序时,我应该能够看到已经添加到 Firestore 的项目(文档)。但这正在发生
onCreateViewHolder 仅在我点击 textview 时被调用,并且当失焦时,视图会刷新。
我不明白发生了什么事。我在Browserstack 上测试了我的应用程序,并且在其他设备上也遇到了同样的问题。
这是我的代码:
ScrollingActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scrolling);
Log.d(TAG, "onCreate: started");
RecyclerView recyclerView = findViewById(R.id.expense_list);
FirebaseFirestore db = FirebaseFirestore.getInstance();
mAuth = FirebaseAuth.getInstance();
Query query = db.collection("users").document(mAuth.getCurrentUser().getUid()).collection("expenses");
FirestoreRecyclerOptions<Expense> options = new FirestoreRecyclerOptions.Builder<Expense>()
.setQuery(query, Expense.class)
.build();
adapter = new FirestoreRecyclerAdapter<Expense, ExpenseViewHolder>(options) {
@NonNull
@Override
public ExpenseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
Log.d(TAG, "onCreateViewHolder: called");
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(R.layout.individual_expenditure_layout, parent, false);
return new ExpenseViewHolder(view);
}
@Override
protected void onBindViewHolder(@NonNull ExpenseViewHolder expenseViewHolder, int position, @NonNull Expense expense) {
Log.d(TAG, "onBindViewHolder: called");
expenseViewHolder.setAmount(expense.getAmount());
expenseViewHolder.setDescription(expense.getDescription());
}
};
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
}
@Override
protected void onStart() {
super.onStart();
adapter.startListening();
}
@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}
Expense.java
public class Expense {
private Timestamp timestamp;
private float amount;
private String description;
public Expense() { timestamp = Timestamp.now(); }
public Expense(float amount, String description){
this.timestamp = Timestamp.now();
this.amount = amount;
this.description = description;
}
public float getAmount() {
return amount;
}
public String getDescription() {
return description;
}
}
ExpenseViewHolder.java
public class ExpenseViewHolder extends RecyclerView.ViewHolder {
private TextView textView_amount, textView_description;
public ExpenseViewHolder(@NonNull View itemView) {
super(itemView);
textView_amount = itemView.findViewById(R.id.textView_Amount);
textView_description = itemView.findViewById(R.id.textView_Description);
}
public void setAmount(float amount) {
textView_amount.setText(String.format(Locale.US,"₹ %.2f", amount));
}
public void setDescription(String description) {
textView_description.setText(description);
}
}
activity_scrolling.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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"
android:fitsSystemWindows="true"
tools:context=".ScrollingActivity">
<androidx.core.widget.NestedScrollView
android:id="@+id/nestedScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_anchorGravity="center"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
android:paddingBottom="130dp">
<!-- TODO: This paddingBottom will not work for every device -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/expense_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">
</androidx.recyclerview.widget.RecyclerView>
</androidx.core.widget.NestedScrollView>
<include
android:layout_width="match_parent"
android:layout_height="wrap_content"
layout="@layout/add_expense_form"
android:layout_gravity="bottom"
/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
我已经坚持了 2 天了。
没有发现这些有用:FirestoreRecyclerAdapter not updating views、RecyclerView not calling onCreateViewHolder or onBindView、Can't get FirestoreRecyclerAdapter to show items
找到this tutorial,他们只做过类似的事情。不知道为什么会发生在我身上。
【问题讨论】:
-
听起来
query在这种情况下没有给出任何结果。如果您在没有 FirebaseUI 的情况下获取查询数据,您可以看到会发生什么,如下所示:firebase.google.com/docs/firestore/query-data/… 因此,在您的情况下,您会执行query.get()...,然后检查是否有任何结果或错误。 -
但是只要点击任何
textview,数据就会出现,所以查询正在返回一些东西。只是不是在应用启动时。 -
有趣。您共享的代码中的任何内容似乎都不会导致这种情况。请注意,动画对我来说不是很有洞察力,因为我不知道应用程序应该在那里做什么。如果您可以仅通过记录输出来重现问题,那么通常会更容易提供帮助。
标签: android android-recyclerview google-cloud-firestore