Android Studio从ListView和Firebase中删除项目 [英] Android studio remove items from both listview and firebase
问题描述
我正在尝试从android studio中的listview和firebase中删除项目.当我从Firebase控制台中删除项目时,它会自动从列表视图中删除项目.但是我想首先从列表视图中删除项目,并希望此更改反映在数据库中.
I'm trying to remove items from both listview and firebase in android studio. When I remove items from the firebase console, it automatically removes items from listview. However I want to remove items from the listview first, and want this changes to be reflected on the database.
public class PreferActivity extends AppCompatActivity {
//Firebase Var
private DatabaseReference mDatabase;
//Android Layout
private Button btnAdd;
private EditText etText;
private ListView listView;
//Array list
private ArrayList<String> arrayList = new ArrayList<>();
private ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prefer);
mDatabase= FirebaseDatabase.getInstance().getReference();
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,arrayList);
btnAdd = (Button) findViewById(R.id.btnAdd);
etText = (EditText) findViewById(R.id.etDatabase);
listView = (ListView) findViewById(R.id.database_list_view);
listView.setAdapter(adapter);
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDatabase.push().setValue(etText.getText().toString());
}
});
mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String string = dataSnapshot.getValue(String.class);
arrayList.add(string);
adapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
String string = dataSnapshot.getValue(String.class);
arrayList.remove(string);
adapter.notifyDataSetChanged();
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
任何评论都会对我有所帮助.预先感谢
Any comments would help me. Thanks in advance
推荐答案
现在此解决方案可能是硬编码的,但这是因为您仅将Strings存储在数据库中,同时还需要它们的键来告诉firebase删除哪个字符串..我的建议是再创建一个 ArrayList
来存储键,并在Item Click上访问它.
Now this solution might be hard coded, but that's because you're only storing Strings on the database while you also need their keys to tell firebase which one to delete. My recommendation is having a second ArrayList
to store the keys and access it on Item Click.
因此,首先您声明此 ArrayList
,我们将其命名为 keysList
:
So first you declare this ArrayList
, let's name it keysList
:
private ArrayList<String> arrayList = new ArrayList<>();
private ArrayList<String> keysList = new ArrayList<>();
然后,您必须更改您的 onChildAdded
方法,以将这些键存储在 ArrayList
中:
then you must change your onChildAdded
method to store those keys in the ArrayList
:
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String string = dataSnapshot.getValue(String.class);
arrayList.add(string);
keysList.add(dataSnapshot.getKey());
adapter.notifyDataSetChanged();
}
但是您还必须更改您的 onChildRemoved
,以从 keysList
中删除已删除的密钥:
But then you'd also have to change your onChildRemoved
to remove the deleted keys from the keysList
:
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
String string = dataSnapshot.getValue(String.class);
arrayList.remove(string);
keysList.remove(dataSnapshot.getKey());
adapter.notifyDataSetChanged();
}
最后,将 onItemClickListener
添加到您的 listView
中,以便用户可以单击以从Firebase中删除该项目:
And finally, add an onItemClickListener
to your listView
so that the user can click to remove the item from Firebase:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
String key = keysList.get(position);
mDatabase.child(key).removeValue();
}
});
这篇关于Android Studio从ListView和Firebase中删除项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!