我的android项目有一些特殊问题。特别是,我有两个集合:用户和课程:第一个包含两个字符串(电子邮件和idCourse)的用户(教师)列表在第二个课程中,有一个课程列表,每个课程都与一个用户相关(idCourse与该用户相同),在每个课程中,都有一个课程列表,我需要与特定用户一起访问。我将对象的数据保存在对象admin中,以访问特定的Lessons集合,因为在路径中有admin id。
Courses path to LessonsUsers collection
我尝试过,但是当我将id保存在addCompleteListener方法中时,数据就丢失了,实际上在addSnapshotListener中admin.getCourseId()的值为null,所以我的recyclerView结果为空。如果我尝试在第一个方法中复制第二种方法,则将idCourse保存在Admin中后,该方法就可以使用,但是如果我在使用该应用程序时单击该课程,则该应用程序将崩溃。我知道这可能是我的一个特定问题,但我想听听您的一些信息。我也发布了我的android项目。Android Project on Google Drive预先感谢您的帮助!
CLASS LezioniDocenteActivity:
public class LezioniDocenteActivity extends AppCompatActivity {
private static final String TAG = "FireLog";
private RecyclerView mMainList;
private FirebaseFirestore mFirestore;
private FirebaseAuth firebaseAuth;
private LessonsListAdapter lessonsListAdapter;
private List<Lesson> lessonList;
private String course_id;
//admin per memorizzare le info
private final User admin = new User();
@Override
public void onBackPressed(){
startActivity(new Intent(LezioniDocenteActivity.this, DocenteActivity.class));
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lezioni_docente);
lessonList = new ArrayList<>();
lessonsListAdapter = new LessonsListAdapter(lessonList, getApplicationContext());
mMainList = (RecyclerView)findViewById(R.id.lesson_list);
mMainList.setHasFixedSize(true);
mMainList.setLayoutManager(new LinearLayoutManager(this));
mMainList.setAdapter(lessonsListAdapter);
firebaseAuth = FirebaseAuth.getInstance();
//utente in uso corrente
final FirebaseUser user = firebaseAuth.getCurrentUser();
admin.setEmail(user.getEmail());
mFirestore = FirebaseFirestore.getInstance();
mFirestore.collection("Users").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
boolean find = false;
for (DocumentSnapshot doc : task.getResult()) {
String email = doc.getString("email");
if (email.equals(admin.getEmail())) {
//getting admin's courseID
admin.setCourseId(doc.getString("idCorso"));
break;
}
}
}
});
mFirestore.collection("Courses /" + admin.getCourseId() + "/Lessons").addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot documentSnapshots, @Nullable FirebaseFirestoreException e) {
if(e!=null){
Log.d(TAG, "Error :" + e.getMessage());
return;
}
for(DocumentChange doc : documentSnapshots.getDocumentChanges()){
if(doc.getType() == DocumentChange.Type.ADDED){
Lesson lesson = doc.getDocument().toObject(Lesson.class);
lessonList.add(lesson);
lessonsListAdapter.notifyDataSetChanged();
}
}
}
});
}
}
CLASS LessonListAdapter:
public class LessonsListAdapter extends RecyclerView.Adapter<LessonsListAdapter.ViewHolder> {
public List<Lesson> lessonList;
public Context context;
final User admin = new User();
public LessonsListAdapter(List<Lesson> lessonList, Context context){
this.lessonList = lessonList;
this.context = this.context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_lessons, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
final FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
final FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
final FirebaseUser user = firebaseAuth.getCurrentUser();
admin.setEmail(user.getEmail());
holder.dayText.setText(lessonList.get(position).getLessonDate());
holder.argText.setText(lessonList.get(position).getArgument());
final String lessID = lessonList.get(position).lessonID;
final int i = position;
firebaseFirestore.collection("Users").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
boolean find = false;
for(DocumentSnapshot doc : task.getResult()){
String email = doc.getString("email");
if(email.equals(admin.getEmail())) {
find = true;
//getting admin's courseID
admin.setCourseId(doc.getString("courseId"));
break;
}
}
if (find){
holder.delete.setVisibility(View.VISIBLE);
holder.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(context, "OnClick funziona", Toast.LENGTH_SHORT).show();
}
});
} else holder.delete.setVisibility(View.GONE);
}
});
}
@Override
public int getItemCount() {
return lessonList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
View mView;
public TextView dayText;
public TextView argText;
public ImageView delete;
public ViewHolder(@NonNull View itemView) {
super(itemView);
mView = itemView;
dayText = (TextView) mView.findViewById(R.id.day_text);
argText = (TextView) mView.findViewById(R.id.arg_text);
delete = (ImageView) mView.findViewById(R.id.ic_delete);
}
}
}
以下代码将为您工作。但是您必须根据它进行更改。我没有使用Android Studio。这是记事本代码。
mfirebaseFirestore.collection("Users").orderBy("email")
.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
for (QueryDocumentSnapshot querySnapshot : task.getResult()){
if (querySnapshot.get("email").equals(user.getEmail())){
mfirebaseFirestore.collection("Courses/"+ querySnapshot.get("idCorso")+"/Lessons")
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot documentSnapshots, @Nullable FirebaseFirestoreException e) {
for(DocumentChange doc : documentSnapshots.getDocumentChanges()){
if(doc.getType() == DocumentChange.Type.ADDED){
Lesson lesson = doc.getDocument().toObject(Lesson.class);
lessonList.add(lesson);
}
lessonsListAdapter = new LessonsListAdapter(lessonList, getApplicationContext());
lessonsListAdapter.notifyDataSetChanged();
}
}
});
}
}
}
});
关于代码的说明:
从上面的代码,每个人都解释说,Firebase调用是异步的(例如answer)。因此,您尝试检索的数据将收到您所说的null。
上面的代码将检查数据库中有关电子邮件的信息,然后检索该用户的详细信息。这意味着您将从中获取课程ID。然后直接通过传递课程ID来调用函数以检索课程列表。