对不起,标题模糊,我只是不知道该如何形容。
我的问题在于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"/>
答案 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里面做一个日志并检查