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

时间:2018-01-31 23:49:42

标签: java android firebase-realtime-database android-recyclerview firebaseui

我试图在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:文本):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?

    image description

  2. 在setText中的 onBindingViewHolder 中的
  3. :如何让我的TextViews从我的firebase获取值?

  4. 我是编程的新手,并且不确定onCreateViewHolder,onBindingHolder和cheesesViewHolder。我不确定我在那里写的每个代码意味着其中一些是复制粘贴的。如果我弄错了,你能解释一下吗?我可以达到我想要的结果吗,我做错了什么?
  5. 提前谢谢你:)

2 个答案:

答案 0 :(得分:0)

修改onBindingViewHoldercheesesViewHolder。因为在onBindingViewHolder中,您将使用Views而不是Views将数据与ids绑定。将Viewsids内的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... } 内你会做这样的事情:

s = s.query("multi_match", query=query, type='phrase', phrase_slop=1, fields=['name', 'title'])

答案 1 :(得分:0)

I was able to eventually fix my problem and get onCreateViewHolder and onBindViewHolder to start simply by adding

adapter.startListening();

to my onStart method. like this:

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

And I edited the code using @Yupi suggestion.