2017-02-08 13 views
0

RecyclerViewにランダムな質問を表示したいと思います。質問に答えると(ライトまたは間違っている)、彼はアプリを閉じても、再びこのユーザーに表示されるべきではありません。その後、アクティビティがリロードされ、新しいランダムな質問が表示されます。Firebase:RecyclerViewを使用するユーザーごとに1回だけ表示する

ユーザーがデータベース内のすべての質問を表示すると、その時点で質問がないことを示すメッセージが表示されます。

私のコードは今すぐクリックした後に質問を見た場合、Firebaseデータベースに入れています。

私はifの文を入れようとしましたが(それは馬鹿馬鹿しい考えです)、短時間で動作します。基本的には、子が存在する場合、アクティビティをリロードします。データベースには何千もの質問がありますが、それはある期間働いてしまいますが、ある日はクラッシュします。

私の問題:

まず、私はまだ現れていない質問を「見つける」ための活動をn回をリロードする必要はありません。

第2に、ユーザーがメッセージを表示するためにすべての質問を表示するタイミングを判断できません。ここで

はコードです:

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

を問わず、このIndexedFirebaseRecyclerAdapterであなたのFirebaseRecyclerAdapterを置き換え:

keyRefとdataRefは両方

ある
new FirebaseIndexRecyclerAdapter<Question, QuestionHolder>(Question.class, 
                R.layout.question, 
                QuestionHolder.class, 
                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

ありがとうございました!それは働いている! –

関連する問題