gpt4 book ai didi

android - ListView 使用自定义适配器。用于删除 Firebase 数据库中的子项的按钮

转载 作者:行者123 更新时间:2023-11-29 01:16:57 26 4
gpt4 key购买 nike

我是 android 开发的新手,我很难让我的 listView 与 FirebaseDatabase 一起工作。

我有一个 ListView,其中代表我的 FirebaseDatabase 中的一个对象的每个项目都有一个删除按钮。我想要做的是,当用户点击按钮时,从在线数据库中删除这个条目。如果我没记错的话,那应该触发包含 ListView 的 Activity 中的 onChildRemoved() 回调方法,因此,我必须在那里更新 ListView(已经处理好了)

我尝试在我的适配器中实现 setOnClickListener,但我无法让它工作。你们有人知道怎么做吗?

附带问题:我使用 push() 方法将我的对象添加到数据库中。由于删除对象需要 key ,因此我认为将 pushId 成员添加到所述对象是跟踪它的最简单方法。我只想知道这个逻辑是否合理。

如果您觉得其中任何一个很奇怪,请告诉我。我知道我做这一切的可能性是错误的,我想以正确的方式做到这一点!

最佳答案

您的问题有点像一个小型项目,但我为您编写了一些代码,希望对您有所帮助。

下面的代码制作了一个“thingy”对象的示例数组列表。 Thingy 对象有一个名称(例如:box、toy、cat)和 UID 字段(使用您提到的正在使用的 push() 方法生成)。然后将 Thingy 对象列表设置为 FirebaseDatabase 根节点 (ref),并将其标签作为其 UID。虽然您可能已经编写了这段代码,但我们将使用此代码块作为示例。

    // a root database reference
DatabaseReference ref =
FirebaseDatabase.getInstance().getReference().child("RootNode");

// sample arraylist of objects
// Thingy objects have a type and UID field
ArrayList<Thingy> thingyList = new ArrayList();
thingyList.add(new Thingy("box",ref.push().getKey()));
thingyList.add(new Thingy("toy",ref.push().getKey()));
thingyList.add(new Thingy("cat",ref.push().getKey()));

// set all Thingy objects in thingyList to your root node
// under the label that is the thingy's UID
for (Thingy x : thingyList) {
ref.child(x.getUID()).setValue(x);
}

// setup the adapter and listview
// R.id.remove_item is an xml layout that contains
// a textview and a remove button
MyAdapter myAdapter = new MyAdapter( this, R.layout.remove_item, thingyList);
ListView myList = (ListView) findViewById(R.id.removeListView);
myList.setAdapter(myAdapter);

然后,为了使用您的适配器使用删除按钮从您的 FirebaseDatabase 中删除小东西,您可以为每个项目的每个按钮附加一个 onClickListener。然后使用 remove() 从数据库中完全删除该对象。

public class MyAdapter extends ArrayAdapter<ArrayList> {
private Context context;
private int resource;
private ArrayList arrayList;

private DatabaseReference ref =
FirebaseDatabase.getInstance().getReference().child("RootNode");


public MyAdapter(Context context, int resource, ArrayList arrayList) {
super(context, resource, arrayList);
this.context = context;
this.resource = resource;
this.arrayList = arrayList;
}

private static class ViewHolder {
TextView type;
Button removeButton;
}

@Override
public View getView(int position, View convertView,ViewGroup parent) {
View row;
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(resource, parent, false);
viewHolder.type = (TextView) row.findViewById(R.id.type);
viewHolder.removeButton = (Button) row.findViewById(R.id.removeButton);
row.setTag(viewHolder);
} else {
row = convertView;
viewHolder = (ViewHolder) convertView.getTag();
}

final Thingy x = (Thingy) arrayList.get(position);

viewHolder.type.setText(x.getType());
viewHolder.removeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

ref.child(x.getUID()).removeValue();
}
});
return row;
}

为每个项目附加一个监听器可能会很昂贵,因此如果您有大量对象,性能可能会下降。然而,这是在适配器中使用监听器的实现,当您的 ListView 项变得更加复杂时,使用适配器会变得棘手。因此,也许随着您对 android 的了解越来越多,您可以找到一种更有效的方法来删除项目中的项目。

关于您的其他问题:是的,将调用 onChildRemoved。但是,从 onChildRemoved 更新 ListView 没有意义。如果用户删除一个项目,onClick 应该执行删除操作。至于访问同一数据库的其他用户,他们应该在他们的应用程序尝试创建 ListView 时简单地读取数据库。仅当您需要向所有其他用户广播某种类型的警报以告知发生了某事时,使用 onChildRemoved 才有意义。

使用 push() 是创建唯一 ID(在我的代码中为 UID)的一种简单而安全的方法,可用于在整个项目中引用对象。虽然您可以使用继承将对象与其 UID 分开(有一个仅包含 id 的父类并在子类对象上使用 setValue),但我通常只将 UID 包含在对象实例字段中,然后在发送它们时获取 UID到数据库。

关于android - ListView 使用自定义适配器。用于删除 Firebase 数据库中的子项的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38933930/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com