在事件监听器中更改变量?

时间:2016-12-06 12:10:13

标签: java android firebase firebase-realtime-database

我正在开发一个Android配方应用程序,用户可以选择只查看纯素食谱。我正在使用Firebase作为我的数据库,我在我的活动中存储变量" vegan",显示我正在检索" vegan"的值的食谱。来自我的数据库,可以是"是"或"不" (第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());
                }
            });
        } 
    }
}

2 个答案:

答案 0 :(得分:2)

问题很可能是,在if语句中检查onDataChange时,vegan没有被调用。像这样的回调是异步的,因此在执行任何依赖于结果的逻辑之前,您需要等待回调。

一般来说,您正在运行的内容是许多人在尝试映射&#34;加入&#34;时会遇到从SQL背景迁移到Firebase的内容。像这样Firebase需要的嵌套查询。可能在这个特定问题的范围之外,但使用RxJava可以更轻松地管理这样的操作集(例如,具有异步响应和第二个查询需要使用第一个响应)。

答案 1 :(得分: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);


    }