[英]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.