【发布时间】: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