Switch语句执行2件事,而不仅仅是1

时间:2018-07-07 09:29:34

标签: java android firebase switch-statement toolbar

对不起,标题模糊,我只是不知道该如何形容。

我的问题在于switch语句,该语句用于处理工具栏中菜单项的单击事件。

工具栏由2个菜单项,一个“收藏”按钮(显示)和一个“不收藏”按钮(不可见)组成。单击“收藏夹”按钮时,该项目将被添加到收藏夹中,并且该按钮将被隐藏。将显示不喜欢的按钮。

问题: -将零件添加到收藏夹并显示不喜欢的按钮的第一部分效果很好。 -第二部分执行以下操作:单击“收藏夹”按钮时,该项目将从收藏夹中删除,也将立即再次添加到数据库中。我似乎无法找出原因。看来,在这里执行“添加到收藏夹”按钮中的确切代码。

Maby,这只是一个小错误,但我看不到它。预先感谢!

编辑: 将UnFavoriteBtn情况的返回true更改为中断时,会正确删除值,只有这样,才不会显示删除数据的提示,并且menuItem不会变回“收藏夹”按钮。 更改两种情况后,如果返回true即可中断,单击菜单项时应用程序将崩溃。

代码:

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    switch (item.getItemId())
    {
        case R.id.FavoriteBtn:

            myRef.addValueEventListener(new ValueEventListener()
            {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot)
                {
                    String key = getActivity().getIntent().getExtras().getString("Key");

                    mAuth = FirebaseAuth.getInstance();
                    FirebaseUser user = mAuth.getCurrentUser();
                    UserID = user.getUid();

                    String dienstverband = dataSnapshot.child("Vacatures").child(key).child("Dienstverband").getValue(String.class);
                    String functie = dataSnapshot.child("Vacatures").child(key).child("Functie").getValue(String.class);
                    String functie_locatie = dataSnapshot.child("Vacatures").child(key).child("Functie_Locatie").getValue(String.class);
                    String locatie = dataSnapshot.child("Vacatures").child(key).child("Locatie").getValue(String.class);
                    String omschrijving = dataSnapshot.child("Vacatures").child(key).child("Omschrijving").getValue(String.class);
                    String omschrijving_volledig = dataSnapshot.child("Vacatures").child(key).child("Omschrijving volledig").getValue(String.class);
                    String opleidingsniveau = dataSnapshot.child("Vacatures").child(key).child("Opleidingsniveau").getValue(String.class);
                    String salarisschaal = dataSnapshot.child("Vacatures").child(key).child("Salarisschaal").getValue(String.class);

                    HashMap<String, Object> dataMap = new HashMap<String, Object>();
                    dataMap.put("Functie", functie);
                    dataMap.put("Key", key);
                    dataMap.put("Locatie", locatie);
                    dataMap.put("Omschrijving", omschrijving);
                    dataMap.put("Omschrijving volledig", omschrijving_volledig);
                    dataMap.put("Opleidingsniveau", opleidingsniveau);
                    dataMap.put("Dienstverband", dienstverband);
                    dataMap.put("Salarisschaal", salarisschaal);
                    dataMap.put("Functie_Locatie", functie_locatie);

                    myRef.child("Favorites").child(UserID).child(key).setValue(dataMap).addOnCompleteListener(new OnCompleteListener<Void>()
                    {
                        @Override
                        public void onComplete(@NonNull Task<Void> task)
                        {
                            Toast.makeText(getActivity(), "Vacature aan favorieten toegevoegd", Toast.LENGTH_SHORT).show();
                            mMenu.findItem(R.id.FavoriteBtn).setVisible(false);
                            mMenu.findItem(R.id.UnFavoriteBtn).setVisible(true);
                        }
                    });
                }

                @Override
                public void onCancelled(DatabaseError databaseError)
                {

                }
            });
            return true;

        case R.id.UnFavoriteBtn:

            mDatabase = FirebaseDatabase.getInstance();
            myRef2 = mDatabase.getReference();

            String key = getActivity().getIntent().getExtras().getString("Key");

            mAuth = FirebaseAuth.getInstance();
            FirebaseUser user = mAuth.getCurrentUser();
            UserID = user.getUid();

            myRef2.child("Favorites").child(UserID).child(key).removeValue().addOnSuccessListener(new OnSuccessListener<Void>()
            {
                @Override
                public void onSuccess(Void aVoid)
                {
                    Toast.makeText(getActivity(), "Vacature uit favorieten verwijderd", Toast.LENGTH_SHORT).show();
                    mMenu.findItem(R.id.FavoriteBtn).setVisible(true);
                    mMenu.findItem(R.id.UnFavoriteBtn).setVisible(false);
                }
            });
            return true;
    }
    return onOptionsItemSelected(item);
}

工具栏菜单:

<item
    android:id="@+id/FavoriteBtn"
    android:icon="@drawable/ic_favorite_border"
    android:title="Favorite"
    app:showAsAction="ifRoom"
    android:visible="true"/>

<item
    android:id="@+id/UnFavoriteBtn"
    android:icon="@drawable/ic_favorite"
    android:title="UnFavorite"
    app:showAsAction="ifRoom"
    android:visible="false"/>

2 个答案:

答案 0 :(得分:0)

addvalueListener用于侦听(表示如果数据库更改有任何更改,它将触发)。

这就是为什么该特殊块执行两次的原因。 首先,当您单击菜单项时(它将数据插入firebase) 其次,因为Firebase在数据库中发生了更改,因此可以触发。

将您的插入代码放在eventListener块之外。

 HashMap<String, Object> dataMap = new HashMap<String, Object>();
                    dataMap.put("Functie", functie);
                    dataMap.put("Key", key);
                    dataMap.put("Locatie", locatie);
                    dataMap.put("Omschrijving", omschrijving);
                    dataMap.put("Omschrijving volledig", omschrijving_volledig);
                    dataMap.put("Opleidingsniveau", opleidingsniveau);
                    dataMap.put("Dienstverband", dienstverband);
                    dataMap.put("Salarisschaal", salarisschaal);
                    dataMap.put("Functie_Locatie", functie_locatie);

                    myRef.child("Favorites").child(UserID).child(key).setValue(dataMap).addOnCompleteListener(new OnCompleteListener<Void>()
                    {
                        @Override
                        public void onComplete(@NonNull Task<Void> task)
                        {
                            Toast.makeText(getActivity(), "Vacature aan favorieten toegevoegd", Toast.LENGTH_SHORT).show();
                            mMenu.findItem(R.id.FavoriteBtn).setVisible(false);
                            mMenu.findItem(R.id.UnFavoriteBtn).setVisible(true);
                        }
                    });
                }

                @Override
                public void onCancelled(DatabaseError databaseError)
                {

                }

仅将此代码放入开关块中以插入数据。

答案 1 :(得分:0)

“只有这样,才能显示数据已被删除并且menuItem不会变回收藏夹按钮”,这实际上是在调用OnSuccess回调方法吗?在onSuccess之前在addOnSuccessListener里面做一个日志,看看它是否真的被调用...如果是的话,在onSucess里面做一个日志并检查