【问题标题】:FirebaseRecyclerAdapter to populate object with other object insideFirebaseRecyclerAdapter 用里面的其他对象填充对象
【发布时间】:2018-11-30 06:40:27
【问题描述】:

我是 Android 开发新手,在将 Firebase 实时数据库中的数据填充到 FirebaseRecyclerAdapter 方面需要帮助。

我的应用有一个研讨会列表。用户可以使用 GitHub 身份验证登录我的测试应用程序,如果按下相关按钮,我会收到一封用户电子邮件以登录或退出研讨会。

因此,在某些时候,我的研讨会包含一个用户列表,如下面的 Firebase 示例所示。

问题是我需要在回收站视图中突出显示用户已经登录的研讨会。

我面临的主要问题是填充每个研讨会的信息时。稍后我可以轻松地让用户单独列出,但我从一开始就不知道如何在一个不错的 Workshop 对象中执行此操作。

我迷路了。请帮忙。

我的FirebaseRecyclerAdapter

public class WorkshopsFirebaseRecyclerAdapter extends FirebaseRecyclerAdapter<Workshop, WorkshopViewHolder> {

    private Context mContext;
    private ProgressBar progressBar;

    public WorkshopsFirebaseRecyclerAdapter(FirebaseRecyclerOptions<Workshop> options, Context context, ProgressBar view) {
        super(options);
        mContext = context;
        progressBar = view;
    }

    @Override
    public void onDataChanged() {
        if (progressBar != null) {
            progressBar.setVisibility(View.GONE);
        }
    }

    @Override
    protected void onBindViewHolder(@NonNull final WorkshopViewHolder holder, final int position, @NonNull final Workshop model) {

        final Workshop workshop = getItem(position);
        final String id = getRef(position).getKey();

        holder.date.setText(getUserFriendlyDate(workshop.getDate()));
        holder.description.setText(workshop.getDescription());

        if (workshop.getWorkshopAttendants() != null){
            Timber.i("onBindViewHolder workshop is %s", workshop.toString());
        }

        holder.getView().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TinyDB tinyDB = new TinyDB(mContext);
                tinyDB.putObject(mContext.getString(R.string.workshop_tinydb_key), workshop);
                Intent intent = new Intent(mContext, WorkshopDetailsActivity.class);
                intent.putExtra(mContext.getString(R.string.open_workshop_details_intent_key),
                        WorkshopDetailsActivity.INTENT_OPEN_UPDATE_WORKSHOP_DETAILS);
                intent.putExtra(mContext.getString(R.string.current_workshop_id_key), id);
                mContext.startActivity(intent);
            }
        });
    }

    @Override
    public WorkshopViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View itemView = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.workshop_rv_item, viewGroup, false);
        return new WorkshopViewHolder(itemView);
    }

    private String getUserFriendlyDate(String dateOld){
        Date date = new Date();
        SimpleDateFormat oldDateFormat = new SimpleDateFormat("dd-MM-yyyy", Locale.UK);
        try {
            date = oldDateFormat.parse(dateOld);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        SimpleDateFormat newDateFormat = new SimpleDateFormat("dd MMM yyyy", Locale.UK);
        return newDateFormat.format(date);
    }

}

我设置适配器和查询的方法:

 private void loadWorkshopsForCity(String city) {
        Query query;
        if (city.equals(getString(R.string.spinner_cities_all_value))) {
            query = FirebaseDatabase.getInstance()
                    .getReference(getString(R.string.firebase_root_name))
                    .child(getString(R.string.firebase_workshops_root_name))
                    .limitToLast(50);
        } else {
            query = FirebaseDatabase.getInstance()
                    .getReference(getString(R.string.firebase_root_name))
                    .child(getString(R.string.firebase_workshops_root_name))
                    .orderByChild(getString(R.string.firebase_workshop_city_name_key))
                    .equalTo(city);
        }

        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot workshopSnapshot : dataSnapshot.getChildren()) {
                    Workshop workshop = workshopSnapshot.getValue(Workshop.class);
                    for(DataSnapshot usersSnapshot : workshopSnapshot.child("users").getChildren()){
                        if (usersSnapshot.exists()){
                            WorkshopAttendant user = usersSnapshot.getValue(WorkshopAttendant.class);
                            if (user!=null){
                                users.add(user);
                            }
                        }
                    }
                    if (users.size()!=0){
                        workshop.setWorkshopAttendants(users);
                    }
                }
            }


            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Timber.i(databaseError.toException());
            }
        });

        FirebaseRecyclerOptions<Workshop> options =
                new FirebaseRecyclerOptions.Builder<Workshop>()
                        .setQuery(query, Workshop.class)
                        .build();

        if (adapter != null) {
            adapter.stopListening();
        }

        adapter = new WorkshopsFirebaseRecyclerAdapter(options, this, progressBar);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mRecyclerView.setAdapter(adapter);
        adapter.startListening();

    }

包含参加者列表的我的工作室:

public class Workshop {

    private String date;
    private String time;
    private String description;
    private String name;
    private String address;
    private String city;
    private List<WorkshopAttendant> workshopAttendants;

    private boolean isChecked;

    // empty constructor for firebase
    public Workshop() {
    }

    public Workshop(String date, String time, String description, String name, String address, String city,
                    List<WorkshopAttendant> workshopAttendants) {
        this.date = date;
        this.time = time;
        this.description = description;
        this.name = name;
        this.address = address;
        this.city = city;
        this.workshopAttendants = workshopAttendants;
    } .....

以及其他应在 Workshop 对象内的 WorkshopAttendant。

public class WorkshopAttendant {

    private String email;
    private int role; // 1 - coach ; 0 - organiser ; 2 - student

    public WorkshopAttendant(String userEmail, int role) {
        this.email = userEmail;
        this.role = role;
    }

    // for firebase
    public WorkshopAttendant() {
    }

【问题讨论】:

  • 您是否尝试过使用workshop.getWorkshopAttendants 获取列表?
  • 嗨@AlexMamo,感谢收看。我看到您在其他与 Firebase 相关的主题中做出了回复,因此非常感谢您也查看了我的案例。我试过了,但对于我加载的车间来说它是空的。我在查询的每个步骤中都添加了日志记录,我可以在那里提供用户信息,但我最后得到的研讨会没有。我担心我以错误的方式添加它们。
  • 不客气,塔尼亚! workshop.getWorkshopAttendants的问题解决了吗?
  • 你回复得很快。谢谢:))请看我上面编辑的评论。
  • workshop.getWorkshopAttendants() 返回什么?

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


【解决方案1】:

1) 在 Workshop 模型中列出 WorkshopAttendants 以映射用户 = new HashMap();

2) 为我的 Recycler 选项使用了新的 SnapshotParser;

FirebaseRecyclerOptions<Workshop> options =
                new FirebaseRecyclerOptions.Builder<Workshop>()
                        .setQuery(query, new SnapshotParser<Workshop>() {
                            @NonNull
                            @Override
                            public Workshop parseSnapshot(@NonNull DataSnapshot snapshot) {
                                GenericTypeIndicator<Workshop> t = new GenericTypeIndicator<Workshop>() {};
                                Workshop workshop = snapshot.getValue(t);
                                return workshop;
                            }
                        })
                .build();

3) 在我的适配器中,我为用户设置了检查,因此现在可以标记有用户签名的研讨会。

try {
            Map<String, User> users = workshop.getValue();
            if (users.size()!=0){holder.description.setBackgroundColor(mContext.getColor(R.color.colorPrimaryDark));
            }
        } catch (NullPointerException e){
            Timber.i(e, "no users for %s", workshop.getDescription());
        }

谢谢@AlexMamo 的耐心

【讨论】:

    猜你喜欢
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多