繁体   English   中英

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

[英]Switch statement executing 2 things instead of just 1

抱歉,标题含糊,我只是不知道该如何形容。

我的问题是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"/>

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

                }

仅将此代码放在开关块中才能插入数据。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM