2016-12-06 49 views
0

我正在開發一個android食譜應用程序,用戶可以選擇僅查看純素食譜。我正在使用Firebase作爲我的數據庫,我在其中存儲變量「素食主義者」,在我的活動中顯示食譜,我從數據庫中檢索「素食主義者」的值,可以是「是」或「否」(行:54),然後if語句(行:65)檢查用戶是否想要純素食譜,但是vegan = user.Vegan;似乎並沒有改變變質素,我知道我從數據庫中獲得價值,但它不會改變純素的價值,任何人都可以告訴我我要去哪裏錯了嗎?在事件監聽器中更改變量?

public class SwipeActivity extends AppCompatActivity implements View.OnClickListener { 

    private static final String TAG = "MainActivity"; 
    private DatabaseReference mRecipeReference; 
    private DatabaseReference newRef; 
    private DatabaseReference myRef3; 
    private DatabaseReference veganRef; 
    private TextView editTextName; 
    private TextView editTextCategory; 
    private ImageView profileImageView; 
    private ImageButton Back; 
    private ImageButton Like; 
    private ImageButton Dislike; 
    private DatabaseReference databaseReference; 
    private DatabaseReference userRef; 
    String imgURL; 
    String recipeKey; 
    Map<String, Recipe> likedRecipes = new HashMap<String,Recipe>(); 
    String user = FirebaseAuth.getInstance().getCurrentUser().getUid(); 


    String vegan = "no"; //Here is the variable declaration 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_swipe); 

     databaseReference = FirebaseDatabase.getInstance().getReference(); 
     userRef = FirebaseDatabase.getInstance().getReference().child("user").child(user); 
     mRecipeReference = FirebaseDatabase.getInstance().getReference().child("recipe"); 

     editTextName = (TextView) findViewById(R.id.editTextName); 
     editTextCategory = (TextView) findViewById(R.id.editTextCategory); 
     profileImageView = (ImageView) findViewById(R.id.profileImageView); 
     Back = (ImageButton) findViewById(R.id.Back); 
     Back.setOnClickListener(this); 
     Like = (ImageButton) findViewById(R.id.Like); 
     Like.setOnClickListener(this); 
     Dislike = (ImageButton) findViewById(R.id.Dislike); 
     Dislike.setOnClickListener(this); 

    } 

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

     ValueEventListener userListener = new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       User user = dataSnapshot.getValue(User.class); 
       vegan = user.Vegan; //Here I am retrieving the string from firebase database, which is either "yes" or "no" 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.w(TAG, "loadPost:onCancelled", databaseError.toException()); 
       // ... 
      } 
     }; 
     userRef.addValueEventListener(userListener); 

     if (vegan == "yes") { //Here I am checking if the user is vegan or not 
      veganRef = databaseReference.child("recipe"); 

      veganRef.orderByChild("Category").equalTo("Vegan").addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        for (DataSnapshot recipeSnapshot : dataSnapshot.getChildren()) { 
         Recipe recipe = recipeSnapshot.getValue(Recipe.class); 
         recipeKey = recipeSnapshot.getKey(); 
         editTextName.setText(recipe.Name + ", " + recipe.Calories); 
         editTextCategory.setText(recipe.Category); 
         imgURL = recipe.Img; 

         Picasso.with(getApplicationContext()).load(imgURL)//download URL 
           .placeholder(R.drawable.placeholder_image)//use default image 
           .error(R.drawable.placeholder_image)//if failed 
           .into(profileImageView);//imageview 

         likedRecipes.put(recipeKey, recipe); 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        Log.w(TAG, "loadPost:onCancelled", databaseError.toException()); 
       } 
      }); 
     } 
    } 
} 
+0

作爲@ JohnO'Reilly說這需要一些時間來更新,直到反應來。所以你可以在響應到來之後在onDataChange方法中完成那個任務嗎? – Raghavendra

+1

如果你把你的if語句放在你的'onDataChange'方法中,它可能會工作 –

回答

2

問題是更有可能的onDataChange沒有被調用的時候,你在if語句檢查vegan。這樣的回調是異步的,因此在執行任何依賴於結果的邏輯之前,您需要等待回調。

一般來說,當您嘗試將這種「連接」映射到Firebase需要的嵌套查詢時,您正在運行的是許多人從SQL背景中轉移到Firebase。可能在這個特定問題的範圍之外,但是使用RxJava使管理一組操作變得更容易(例如,具有異步響應和第二個查詢需要使用第一個響應)。

0

在你在onStart()做這樣的事情

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

     ValueEventListener userListener = new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 

       User user = dataSnapshot.getValue(User.class); 
       vegan = user.Vegan; 

       if (vegan == "yes") { //Here I am checking if the user is vegan or not 
         veganRef = databaseReference.child("recipe"); 
         veganRef.orderByChild("Category").equalTo("Vegan").addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          for (DataSnapshot recipeSnapshot : dataSnapshot.getChildren()) { 
          Recipe recipe = recipeSnapshot.getValue(Recipe.class); 
          recipeKey = recipeSnapshot.getKey(); 
          editTextName.setText(recipe.Name + ", " + recipe.Calories); 
          editTextCategory.setText(recipe.Category); 
          imgURL = recipe.Img; 

          Picasso.with(getApplicationContext()).load(imgURL)//download URL 
            .placeholder(R.drawable.placeholder_image)//use default image 
            .error(R.drawable.placeholder_image)//if failed 
            .into(profileImageView);//imageview 

          likedRecipes.put(recipeKey, recipe); 
         } 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 
         Log.w(TAG, "loadPost:onCancelled", databaseError.toException()); 
        } 
      }); 
      } 
     } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
       Log.w(TAG, "loadPost:onCancelled", databaseError.toException()); 
       // ... 
      } 
     }; 
     userRef.addValueEventListener(userListener); 


    }