0

Я хочу иметь RecyclerView, показывая случайные вопросы пользователям. После ответа на вопрос (неправильный или неправильный) он никогда не должен появляться для этого пользователя снова, даже если он закрывает приложение. После этого активность перезагружается и появляется новый случайный вопрос.Firebase: Показывать только элементы для каждого пользователя с помощью RecyclerView

Когда пользователи видят все вопросы в базе данных, он должен показать сообщение о том, что в то время больше нет вопросов.

Мой код прямо сейчас помещается в базу данных Firebase, если пользователь увидел вопрос после нажатия.

Я попытался поставить заявление if (но это кажется глупой идеей), и он работает на короткое время. В основном он говорит, что если ребенок существует, перезагрузите его. Когда в базе данных задаются тысячи вопросов, она будет работать некоторое время, но однажды произойдет сбой.

Мои проблемы:

Во-первых, я не хочу, чтобы перезагрузить активность п раз «найти» вопрос, который до сих пор не появляется.

Во-вторых, я не могу определить, когда пользователи видят все вопросы, чтобы показать сообщение.

Вот код:

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); 


} 

Есть ли разумный способ сделать это?

Дополнительный вопрос: Нужно ли мне перезагрузить всю деятельность или есть способ перезагрузить только RecyclerView?

ответ

0

Это был бы простой подход к решению вашей проблемы. Ваша деятельность больше не будет нуждаться в обновлении, так как это будет обрабатываться вашим адаптером. структура вашей базы данных как таковой

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

Когда пользователь отвечает на вопрос:

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

Replace ваш FirebaseRecyclerAdapter с IndexedFirebaseRecyclerAdapter, так это:

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

где KeyRef и dataRef оба

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

Query DataRef = FirebaseDatabase.getInstance().getReference().child("Category").child(category_key).child("Questions"); 

и generateNewRandomQuestionForUser() что-то вроде этого:

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

Прежде всего спасибо за вашу помощь! Когда я пытаюсь заменить FirebaseRecyclerAdapter FirebaseIndexRecyclerAdapter, он не реализуется. Я не смог найти документацию о IndexedFirebaseRecyclerAdapter. Что я делаю не так? –

+0

Убедитесь, что у вас установлена ​​эта библиотека https://github.com/firebase/FirebaseUI-Android/blob/master/database/README.md – Linxy

+0

Спасибо! Работает! –

Смежные вопросы