0

Ich hätte gerne eine RecyclerView zeigen zufällige Fragen an die Benutzer. Sobald die Frage beantwortet wurde (wright oder wrong), sollte sie für diesen Benutzer nie wieder erscheinen, selbst wenn er die App schließt. Danach wird die Aktivität neu geladen und eine neue zufällige Frage erscheint.Firebase: Zeige Artikel nur einmal für jeden Benutzer mit RecyclerView

Wenn die Benutzer alle Fragen in der Datenbank sehen, sollte eine Meldung angezeigt werden, dass es zu diesem Zeitpunkt keine Fragen mehr gibt.

Mein Code befindet sich gerade in Firebase Datenbank, wenn der Benutzer die Frage nach dem Klick sah.

Ich habe versucht, eine if Aussage (aber es scheint eine dumme Idee) und es funktioniert für eine kurze Zeit. Grundsätzlich heißt es, wenn das Kind existiert, lade die Aktivität neu. Wenn die Datenbank tausende von Fragen enthält, funktioniert es für einen bestimmten Zeitraum, wird aber eines Tages abstürzen.

Meine Probleme:

Zuerst möchte ich nicht die Aktivität n-mal nachladen eine Frage zu „finden“, die noch nicht angezeigt hat.

Zweitens kann ich nicht feststellen, wenn die Benutzer alle Fragen sehen, um eine Nachricht anzuzeigen. Hier

ist der Code:

mDatabase = FirebaseDatabase.getInstance().getReference().child("Category").child(category_key).child("Questions"); 
query = mDatabase.orderByChild("randomId").startAt(randomValue).limitToFirst(1); 

@Override 
protected void onStart() { 
    super.onStart(); 

    FirebaseRecyclerAdapter<Questions, QuestionViewHolder> 
      firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Photos, QuestionViewHolder>(
      Question.class, 
      R.layout.question_grid, 
      QuestionViewHolder.class, 
      query 
    ) { 
     @Override 
     protected void populateViewHolder(final QuestionViewHolder viewHolder, final Question model, int position) { 

      final String question_key = getRef(position).getKey(); 
      final String category_key = getIntent().getExtras().getString("category_id"); 

      mDatabase.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 

        if (dataSnapshot.child(question_key).child("ViwedBy").hasChild(mAuth.getCurrentUser().getUid())) { 

         finish(); 
         startActivity(getIntent()); 


        } else { 

         viewHolder.setQuestion(model.getQuestion());{ 

          @Override 
          public void onClick (View v){ 


           mDatabaseLike.addValueEventListener(new ValueEventListener() { 
           @Override 
           public void onDataChange(DataSnapshot dataSnapshot) { 

            mDatabaseTest = FirebaseDatabase.getInstance().getReference().child("Category").child(category_key).child("Questions").child(question_key).child("ViewedBy").child(mAuth.getCurrentUser().getUid()); 
            mDatabaseTest.setValue(true); 

            finish(); 
            startActivity(getIntent()); 


           } 


           @Override 
           public void onCancelled(DatabaseError databaseError) { 

           } 

          }); 
         } 
         } 
        } 
       } 


       @Override 
       public void onCancelled (DatabaseError databaseError){ 

       } 

      }); 


      mQuestionsList.setAdapter(firebaseRecyclerAdapter); 


} 

Gibt es eine intelligentere Art und Weise, es zu tun?

Zusätzliche Frage: Muss ich die gesamte Aktivität neu laden, oder gibt es eine Möglichkeit, nur den RecyclerView neu zu laden?

Antwort

0

Dies wäre ein einfacher Ansatz zur Lösung Ihres Problems. Ihre Aktivität muss sich nicht mehr selbst aktualisieren, da dies von Ihrem Adapter gehandhabt wird. Struktur Ihrer Datenbank als solche

rootNode 
L ...category/questions... 
L answeredQuestions 
    L userId 
    L randomQuestionId:true 
L questionsForUser 
    L userId 
    L randomQuestionId:true 

Wenn Ihre Benutzer eine Frage beantwortet:

add the questionId to answeredQuestions 
remove the questionId from questionsForUser 
call generateNewRandomQuestionForUser() 

Ersetzen Sie Ihre FirebaseRecyclerAdapter mit einem IndexedFirebaseRecyclerAdapter gleichermaßen dies:

new FirebaseIndexRecyclerAdapter<Question, QuestionHolder>(Question.class, 
                R.layout.question, 
                QuestionHolder.class, 
                keyRef, 
                dataRef); 

wo keyRef und dataRef beide

Query keyRef = FirebaseDatabase.getInstance().getReference().child("questionsForUser").child(userId); 

Query DataRef = FirebaseDatabase.getInstance().getReference().child("Category").child(category_key).child("Questions"); 
so etwas wie dieses

und generateNewRandomQuestionForUser() ist:

public static void generateNewRandomQuestionForUser(final String userId, final String category_key) { 
     FirebaseDatabase.getInstance().getReference().child("answeredQuestions").child(userId).addListenerForSingleValueEvent(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       ArrayList<String> answeredQuestions = new ArrayList<String>(); 
       for (DataSnapshot questionId : dataSnapshot.getChildren()) { 
        answeredQuestions.add(questionId.getKey()); 
       } 
       FirebaseDatabase.getInstance().getReference().child("Category").child(category_key).child("Questions").addListenerForSingleValueEvent(new ValueEventListener() { 
        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         ArrayList<String> availableQuestionKeys = new ArrayList<String>(); 
         for (DataSnapshot questionSnapshot : dataSnapshot.getChildren()) { 
          availableQuestionKeys.add(questionSnapshot.getKey()); 
         } 

         // Using answeredQuestions, availableQuestionKeys, you can user your own algorithm 
         // to select one at random that the user has not seen yet. 
         // Here you can also determine whether a user has seen all possible questions and update UI accordingly. 
         // Once you have your random question as keyOfRandomQuestion: 

         FirebaseDatabase.getInstance().getReference().child("questionsForUser").child(userId).child(keyOfRandomQuestion).setValue(true); 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) {} 
       }); 
      } 
      @Override 
      public void onCancelled(DatabaseError databaseError) {} 
     }); 
    } 
+0

Erstmal Danke für Ihre Hilfe! Wenn ich versuche, FirebaseRecyclerAdapter durch FirebaseIndexRecyclerAdapter zu ersetzen, wird es nicht implementiert. Ich konnte keine Dokumentation über IndexedFirebaseRecyclerAdapter finden. Was mache ich falsch? –

+0

Stellen Sie sicher, dass diese Bibliothek installiert ist https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md – Linxy

+0

Vielen Dank! Es funktioniert! –

Verwandte Themen