【问题标题】:How to fill the RecyclerView with nested object from firebase如何使用来自 firebase 的嵌套对象填充 RecyclerView
【发布时间】:2018-12-28 09:54:58
【问题描述】:

这是我想用 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));

我的事件适配器:

    @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。

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

【问题讨论】:

  • 请告诉我们你的viewholder类
  • @AbhayBohra ViewHolder 添加
  • 在这一行放一个断点:mEvents.add(event);调试您的应用并检查您的事件对象是否已解析。
  • @just 没有那行代码也能正常工作。
  • 我明白了,但请调试你的代码。您可能会因为 mEventCategory 或 getCat() 或 getCatName() 为空而获得空指针异常。

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


【解决方案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 方法将所需数据与小部件绑定(此处没有任何更改)。

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

【讨论】:

  • 所以答案是你的 mEvent.getCat() 为空,这就是你得到 NullPointerException 的原因。
  • 其实我不明白为什么我必须在添加到列表之前分配类别。请原谅我对 Firebase 的了解有限
  • @我认为应该使用Event event = eventSnapshot.getValue(Event.class); 检索包含类别对象的事件对象;
猜你喜欢
  • 2017-10-03
  • 2019-04-18
  • 2018-12-24
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2023-03-12
相关资源
最近更新 更多