- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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/
我在为 MacOSX 构建的独立包中添加 DMG 背景的自定义图标时遇到问题。我在项目的根目录中添加了一个包。正在从中加载自定义图标,但没有加载 DMG 背景图标。我正在使用 Java fx 2.2.
Qt for Symbian 和 Qt for MeeGo 有什么区别?我知道 Qt 是一个交叉编译平台。这是否意味着如果我使用来自 Qt 的库,完全相同的库可以在所有支持 Qt 的设备(例如 Sym
我正在尝试使用 C# .NET 3.5/4.0 务实地运行 SQL Server 数据库的备份。我已经找到了如何完成此操作,但是我似乎找不到用于备份的命名空间库。 我正在寻找 Microsoft.Sq
我最近在疯狂学习 Java,但我通常是一名 .NET 开发人员。 (所以请原谅我的新手问题。) 在 .Net 中,我可以在不使用 IIS 的情况下开发 ASP.Net 页面,因为它有一个简化的 Web
这post仅当打印命令中有字符串时才有用。现在我有大量的源代码,其中包含一条声明,例如 print milk,butter 应该格式化为 print(milk,butter) 用\n 捕获行尾并不成功
所以我的问题是: https://gist.github.com/panSarin/4a221a0923927115584a 当我保存这个表格时,我收到了标题中的错误 NoMethodError (u
如何让 Html5 音频在点击时播放声音? (ogg 用于 Firefox 等浏览器,mp3 用于 chrome 等浏览器) 到目前为止,我可以通过 onclick 更改为单个文件类型,但我无法像在普
如果it1和it2有什么区别? std::set s; auto it1 = std::inserter(s, s.begin()); auto it2 = std::inserter(s, s.en
4.0.0 com.amkit myapp SpringMVCFirst
我目前使用 Eclipse 作为其他语言的 IDE,而且我习惯于不必离开 IDE 做任何事情 - 但是我真的很难为纯 ECMAScript-262 找到相同或类似的设置。 澄清一下,我不是在寻找 DO
我想将带有字符串数组的C# 结构发送到C++ 函数,该函数接受void * 作为c# 结构和char** 作为c# 结构字符串数组成员。 我能够将结构发送到 c++ 函数,但问题是,无法从 c++ 函
我正在使用动态创建的链接: 我想为f:param附加自定义转换器,以从#{name}等中删除空格。 但是f:param中没有转换器
是否可以利用Redis为.NET创建后写或直写式缓存?理想情况下,透明的高速缓存是由单个进程写入的,并且支持从数据库加载丢失的数据,并每隔一段时间持久保存脏块? 我已经搜查了好几个小时,也许是goog
我正在通过bash执行命令的ssh脚本。 FILENAMES=( "export_production_20200604.tgz" "export_production_log_2020060
我需要一个正则表达式来出现 0 到 7 个字母或 0 到 7 个数字。 例如:匹配:1234、asdbs 不匹配:123456789、absbsafsfsf、asf12 我尝试了([a-zA-Z]{0
我有一个用于会计期间的表格,该表格具有期间结束和开始的开始日期和结束日期。我使用此表来确定何时发生服务交易以及何时在查询中收集收入,例如... SELECT p.PeriodID, p.FiscalY
我很难为只接受字符或数字的 Laravel 构建正则表达式验证。它是这样的: 你好<-好的 123 <- 好的 你好123 <-不行 我现在的正则表达式是这样的:[A-Za-z]|[0-9]。 reg
您实际上会在 Repeater 上使用 OnItemDataBound 做什么? 最佳答案 “此事件为您提供在客户端显示数据项之前访问数据项的最后机会。引发此事件后,数据项将被清空,不再可用。” ~
我有一个 fragment 工作正常的项目,我正在使用 jeremyfeinstein 的 actionbarsherlock 和滑动菜单, 一切正常,但是当我想自定义左侧抽屉列表单元格时,出现异常
最近几天,我似乎平均分配时间在构建我的第一个应用程序和在这里发布问题!! 这是我的第一个应用程序,也是我们的设计师完成的第一个应用程序。我试图满足他所做的事情的外观和感觉,但我认为他没有做适当的事情。
我是一名优秀的程序员,十分优秀!