簡體   English   中英

使用FirebaseUI和Firebase數據庫在RecyclerView中顯示CardView

[英]Displaying CardViews inside a RecyclerView using FirebaseUI and Firebase database

我試圖在RecyclerView中顯示CardViews,每張卡將代表一個奶酪對象。 該奶酪對象具有6個實例變量。 這是我的Cheese.java

public class Cheese {
private String CheeseName;
private String CheeseCountryOfOrigin;
private String CheeseDayMade;
private String CheeseDayExpire;
private String CheeseDescription ;
private String CheesePrice;


public Cheese(){}  //Required for firebase

public Cheese(String CheeseName, String CheeseCountryOfOrigin, String CheeseDayMade, String CheeseDayExpire, String CheeseDescription, String CheesePrice) {
    this.CheeseName = CheeseName;
    this.CheeseCountryOfOrigin = CheeseCountryOfOrigin;
    this.CheeseDayMade = CheeseDayMade;
    this.CheeseDayExpire = CheeseDayExpire;
    this.CheeseDescription = CheeseDescription;
    this.CheesePrice = CheesePrice;
}

public String getCheeseName() {
    return CheeseName;
}

public String getCheeseCountryOfOrigin() {
    return CheeseCountryOfOrigin;
}

public String getCheeseDayMade() {
    return CheeseDayMade;
}

public String getCheeseDayExpire() {
    return CheeseDayExpire;
}

public String getCheeseDescription() {
    return CheeseDescription;
}

public String getCheesePrice() {
    return CheesePrice;
}

這是我的cheese_card.xml (為了更好地理解,我對一些android:text進行了硬編碼): cheese_card.xml

我的RecyclerView是一個片段。

這是我的片段: fragment_cheeses_list.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/cheeses_recycler"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical">
</android.support.v7.widget.RecyclerView>

我所有的奶酪項目都已經在我的Firebase實時數據庫中。 為了簡化我的生活,我嘗試使用FirebaseUI用Firebase數據庫中的數據填充RecyclerView。

這是我的CheesesListFragment.java ,顯示在我的MainActivity中:

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.CardView;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;


public class CheeseListFragment extends Fragment {
private static final String TAG = "CheesesListFragment";

private FirebaseDatabase aFirebaseDatabase;
private DatabaseReference aCheesesDatabaseReference;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    Log.e(TAG, "onCreateView Started Successfully");

    //Create the recycler view object
    RecyclerView cheesesRecycler = (RecyclerView) inflater.inflate(R.layout.fragment_cheeses_list, container, false);

    //Add a grid layout manager to the recycler view
    GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), 1);
    cheesesRecycler.setLayoutManager(layoutManager);

    cheesesRecycler.setHasFixedSize(true);

    aFirebaseDatabase = FirebaseDatabase.getInstance();
    aCheesesDatabaseReference = aFirebaseDatabase.getReference().child("cheeses");

    //Query the cheeses in firebase db using firebaseUI instead of addChildEventListener
    Query query = aCheesesDatabaseReference;

    //configuration for the FirebaseRecyclerAdapter
    FirebaseRecyclerOptions<Cheese> options =
            new FirebaseRecyclerOptions.Builder<Cheese>()
                    .setQuery(query, Cheese.class)
                    .build();

    FirebaseRecyclerAdapter adapter = new FirebaseRecyclerAdapter<Cheese, CheeseViewHolder>(options) {
        @Override
        public CheeseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            // Create a new instance of the ViewHolder, in this case we are using a custom
            // layout called R.layout.cheese_card for each item

            CardView cv = (CardView) LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.cheese_card, parent, false);

            return new CheeseViewHolder(cv);
        }

        @Override
        protected void onBindViewHolder(CheeseViewHolder holder, int position, Cheese model) {
            CheeseViewHolder myHolder = (CheeseViewHolder)holder;

            myHolder.cheeseName.setText(model.getCheeseName());
            myHolder.cheeseCountryOfOrigin.setText(model.getCheeseCountryOfOrigin());
            myHolder.cheeseDayMade.setText(model.getCheeseDayMade());
            myHolder.cheeseDayExpire.setText(model.getCheeseDayExpire());
            myHolder.cheeseDescription.setText(model.getCheeseDescription());
            myHolder.cheesePrice.setText(model.getCheesePrice());
        }
    };

    //Set the adapter to the recycle View
    cheesesRecycler.setAdapter(adapter);

    return cheesesRecycler;
}

public static class CheeseViewHolder extends RecyclerView.ViewHolder {
    CardView cardView;

    TextView CheeseName;
    TextView CheeseCountryOfOrigin;
    TextView CheeseDayMade;
    TextView CheeseDayExpire;
    TextView CheeseDescription;
    TextView CheesePrice;

    public CheeseViewHolder (CardView v){
        super(v);
        cardView = v;

        CheeseName = (TextView)cardView.findViewById(R.id.cheese_name);
        CheeseCountryOfOrigin= (TextView)cardView.findViewById(R.id.cheese_origin);
        CheeseDayMade= (TextView)cardView.findViewById(R.id.cheese_day_made);
        CheeseDayExpire= (TextView)cardView.findViewById(R.id.cheese_day_expire);
        CheeseDescription= (TextView)cardView.findViewById(R.id.cheese_description);
        CheesePrice= (TextView)cardView.findViewById(R.id.cheese_price);
    }

}

}

因此,我的問題是:(歡迎回答其中的任何問題,並且非常有幫助)

  1. 如果我做對的話, onCreateViewHolder應該使用我的cheese_card.xml為我的Cheese對象制作ViewHolders。 如果是這樣,假設我刪除了onBindingViewHolder,我是否希望看到很多看起來像我的cheese_card.xml的視圖持有人?

    圖片描述

  2. 在setText的onBindingViewHolder中:如何獲取TextView從Firebase中獲取值?

  3. 我是編程新手,不確定onCreateViewHolder,onBindingHolder和cheesesViewHolder。我不確定在那里寫的每個代碼意味着什么,因為其中有些代碼是復制粘貼的。如果我弄錯了,可以請您解釋一下如何實現我想要的結果,我做錯了什么?

先感謝您 :)

修改onBindingViewHoldercheesesViewHolder 因為在onBindingViewHolder您將綁定具有Views而不是具有ids Views數據。 Views與其ids綁定在cheesesViewHolder 例如:

CardView cardView;
TextView cheese_name;
TextView cheese_origin;

public CheeseViewHolder(CardView v) {
    super(v);
    cardView = v;
    cheese_name = (TextView) cardView.findViewById(R.id.cheese_name);
    cheese_origin = (TextView) cardView.findViewById(R.id.cheese_origin);
    // and so on...
}

然后在onBindingViewHolder您將執行以下操作:

@Override
    protected void onBindViewHolder(CheeseViewHolder holder, int position, Cheese model) {
     cheesesViewHolder myHolder = (cheesesViewHolder)holder;
     myHolder.cheese_name.setText(model.getCheeseName());
     myHolder. cheese_origin.setText(model.getCheeseOrigin());
     //and so on...
}

我最終能夠解決我的問題,並通過添加以下內容來開始onCreateViewHolder和onBindViewHolder

adapter.startListening();

到我的onStart方法。 像這樣:

    @Override
public void onStart() {
    super.onStart();
    Log.e(TAG,"onStart Started Successfully");
    adapter.startListening();
}

我使用@Yupi建議編輯了代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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