如何使用firebase中的嵌套对象填充RecyclerView

时间:2018-06-01 04:39:30

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

这是我想用RecyclerView充气的事件对象:

public class Event {
private String mName;
private String mId;
private String mDate;
private String mPlace;
private User mUser;
private Category mCat;
private String mDescription;

public void setmEventCat(Map<String, Category> mEventCat) {
    this.mEventCat = mEventCat;
}

public Map<String, Category> getmEventCat() {

    return mEventCat;
}

private Map<String,Category> mEventCat;

public String getmDescription() {
    return mDescription;
}

public void setDescription(String mDescription) {
    this.mDescription = mDescription;
}

public Category getCat() {
    return mCat;
}

public void setCat(Category mCat) {
    this.mCat = mCat;
}

public String getDate() {
    return mDate;
}

public String getPlace() {
    return mPlace;
}

private ArrayList<User> mList;

public Event() {
}

public String getName() {
    return mName;
}

public void setName(String mName) {
    this.mName = mName;
}

public void setDate(String mDate) {
    this.mDate = mDate;
}

public void setPlace(String mPlace) {
    this.mPlace = mPlace;
}

public String getId() {
    return mId;
}

public void setId(String mId) {
    this.mId = mId;
}

}

嵌套的Category对象:

public class Category implements Serializable{
private String mCatName;
private String mCatID;

public Category() {
}

public Category(String mCatName) {
    this.mCatName = mCatName;

}

public String getCatName() {
    return mCatName;
}

public String getCatID() {
    return mCatID;
}

public void setCatName(String mCatName) {
    this.mCatName = mCatName;
}

public void setCatID(String mCatID) {
    this.mCatID = mCatID;
}

}

我如何从firebase中检索数据:

    mDataBase = FirebaseDatabase.getInstance().getReference("Event");

    mEvents = new ArrayList<Event>();
    mEvent=new Event();
    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);

    mDataBase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot != null && dataSnapshot.getValue() != null) {
                try {
                    for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {
                        Event event = eventSnapshot.getValue(Event.class);
                        String id = eventSnapshot.getKey();
                        mEvents.add(event);
                        mRecyclerView.scrollToPosition(mEvents.size() - 1);
                        mAdapter.notifyItemInserted(mEvents.size() - 1);
                    }

                }
                catch (Exception ex) {
                    Log.e("ERROR", ex.getMessage());
                }
            }
        }



        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });


    mAdapter = new EventAdapter(mContext, mEvents);
    mRecyclerView.setAdapter(mAdapter);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));

我的EventAdapter:

    @Override
public void onBindViewHolder(EventAdapter.ViewHolder holder, int position) {
    mEvent = mEvents.get(position);
    holder.mEventName.setText(mEvent.getName());

    //Every time I tried to add this line to set category name
    //the NullPointerException error occurs
    holder.mEventCategory.setText(mEvent.getCat().getCatName());
    holder.mEventDate.setText(mEvent.getDate());
}

ViewHolder类:

    public class ViewHolder extends RecyclerView.ViewHolder {

    private TextView mEventName, mEventDate,mEventCategory;

    public ViewHolder(View itemView) {
        super(itemView);
        mEventName = itemView.findViewById(R.id.eventName_tv);
        mEventDate = itemView.findViewById(R.id.date_tv);
        mEventCategory = itemView.findViewById(R.id.categoryTv);



    }
}


@Override
public EventAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_event, parent, false);

    return new ViewHolder(view);
}

问题是事件按我的预期显示,但是我无法在事件中获取类别,只需调用getCat()就可以将其绑定到我的窗口小部件。我知道这可能是由异步Firebase API引起的。如何使用嵌套的类别对象设置TextView。

这是我申请的最终部分,任何提示都会有很大的帮助。 提前谢谢!

1 个答案:

答案 0 :(得分:1)

我找出了可能对其他人有用的问题。在将事件对象添加到列表之前,我按键检索嵌套对象并将其分配给类别对象。最后,将其与事件相关联......

 @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot != null && dataSnapshot.getValue() != null) {
                try {
                    for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {
                        Event event = eventSnapshot.getValue(Event.class);
                        String id = eventSnapshot.getKey();
                        mCategory = eventSnapshot.child(id).getValue(Category.class);
                        event.setCat(mCategory);
                        mEvents.add(event);
                        mRecyclerView.scrollToPosition(mEvents.size() - 1);
                        mAdapter.notifyItemInserted(mEvents.size() - 1);
                    }

                }
                catch (Exception ex) {
                    Log.e("ERROR", ex.getMessage());
                }
            }
        }

然后通过调用pojo getter方法将所需数据与widget绑定(此处未更改任何内容)。

    @Override
public void onBindViewHolder(EventAdapter.ViewHolder holder, int position) {
    mEvent = mEvents.get(position);
    holder.mEventName.setText(mEvent.getName());
    holder.mEventCategory.setText(mEvent.getCat().getCatName());
    holder.mEventDate.setText(mEvent.getDate());
}