Android项目问题[保留中]

问题描述 投票:-6回答:1

我的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);
        }
    }
}
java android firebase android-recyclerview recycler-adapter
1个回答
1
投票

以下代码将为您工作。但是您必须根据它进行更改。我没有使用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来调用函数以检索课程列表。

© www.soinside.com 2019 - 2024. All rights reserved.