Как заполнить RecyclerView вложенным объектом из firebase - PullRequest
0 голосов
/ 01 июня 2018

Это объект события, который я хочу наполнить с помощью 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 ().Я знаю, что это может быть вызвано асинхронным API Firebase.Как я могу настроить TextView с вложенным объектом категории.

Это мой ФИНАЛЬНЫЙ фрагмент моего приложения, любые советы помогут мне.Заранее спасибо!

1 Ответ

0 голосов
/ 01 июня 2018

Я выясняю вопрос, который может быть полезен для других людей.Прежде чем добавить объект события в список, я извлекаю вложенный объект по ключу и назначаю его объекту категории.Наконец, связывая его с событием ...

 @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 (здесь ничего не изменилось).

    @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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...