FirestoreRecyclerAdapter не вызывает onCreateViewHolder - PullRequest
1 голос
/ 12 марта 2020

Я следую этому руководству , согласно которому при запуске приложения я должен видеть элементы (документы), которые уже добавлены в Firestore. Но это происходит

enter image description here

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();
}

Расход. 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 не обновляет представления , RecyclerView не вызывает onCreateViewHolder или onBindView , Не удается получить FirestoreRecyclerAdapter для отображения элементов

Найден этот урок , они сделали только похожие вещи. Не знаю, почему это происходит со мной.

1 Ответ

0 голосов
/ 20 апреля 2020

Проблема заключается в следующих строках:

recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter); 

Его необходимо обновить до:

recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

setHasFixedSize не вызывало обновления.

...