使用 FirebaseUI 和 Firebase 数据库在 RecyclerView 中显示 CardView

Displaying CardViews inside a RecyclerView using FirebaseUI and Firebase database

我正在尝试在 RecyclerView 中显示 CardView,每张卡片都代表一个奶酪对象。 这个奶酪对象有 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 对象创建 ViewHolder。如果是这样,假设我删除了 onBindingViewHolder,我是否应该看到很多看起来像我的 cheese_card.xml 的视图持有者?

  2. in onBindingViewHolder in setText:如何让我的 TextView 从我的 firebase 获取值?

  3. 我是编程新手,对 onCreateViewHolder、onBindingHolder 和 cheesesViewHolder.I 不太确定, 你能解释一下我怎样才能达到我想要的结果,我做错了什么吗?

提前谢谢你:)

修改onBindingViewHoldercheesesViewHolder。因为在 onBindingViewHolder 中,您将与 Views 绑定数据,而不是 Viewsids 绑定数据。将 ViewscheesesViewHolder 中的 ids 绑定。例如:

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 的建议编辑了代码。