gpt4 book ai didi

java - 当我尝试将 Firebase 数据库中的项目包含在其项目列表中时,如何修复微调器不断关闭并重新打开的问题

转载 作者:行者123 更新时间:2023-12-02 06:22:25 24 4
gpt4 key购买 nike

我正在开发一个用于竞赛的应用程序。该应用连接到 Firebase 实时数据库,该数据库被组织成一些子列表,每个子列表都有自己的字符串值,如下所示:

category1:
child1: "string"
child2: "string"
category2:
child3: "string"
child4: "string"
(etc.)

我正在尝试获取这些类别的名称并将它们添加到我的布局之一的微调器下拉列表中。然而,当我测试这个布局时,发生了一些奇怪的事情。如果我点击微调器打开下拉菜单,它会不断刷新自身(我可以看到它不断关闭和重新打开)。更奇怪的是,有时,它只会显示两个字符串的列表(我默认添加),而不显示上面的任何类别名称,但其他时候它会在列表中显示它们。

无论我是否尝试从 Firebase 添加子名字符串,似乎都会发生刷新问题。我可以看出它的发生是因为 Android Studio 中的调试器窗口不断充斥着

D/ViewRootImpl@a8fa8f6[PopupWindow:d00794f]:返回的中继:旧=[286,729][962,1113]新=[286,729][962,1113]结果=0x1表面={valid=true 531823960064 } 改变=假

只要微调器下拉菜单打开(在两种情况下)。我尝试搜索该错误(整体和部分),但找不到与我想要完成的任务完全相关的内容。

以下是将列表添加到 Spinner 的代码(打开 Activity 时调用此方法):

    public void onOpen() {
// This is not the complete method, but the relevant portion of it

final List<String> categories = new ArrayList<>();
categories.add(selectionEmpty);
categories.add(selectionCreateNew);
dbh.dbref.child("users").child("a_users_uid_goes_here").child("flashcards").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
categories.add(child.getKey());
}
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
});
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, categories);
setSelector.setAdapter(dataAdapter);
}

这是我分配给 Spinner 的 OnItemSelectedListener:

    AdapterView.OnItemSelectedListener selectSet = new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int pos, long id) {
String selection = adapterView.getItemAtPosition(pos).toString();
if (selection.equals(selectionEmpty)) onOpen();
if (selection.equals(selectionCreateNew)) onCreateNewSet();
else onSelectSet(selection);
}

@Override
public void onNothingSelected(AdapterView<?> adapterView) {

}
};

onCreateNewSet()onSelectSet(String set) 当前是两个空方法。我认为这不会产生任何影响,但以防万一,他们目前什么也不做。 onOpen() 是上面的代码 fragment 。

这是我第一次使用 Spinner 对象,而且我对 Android Studio 总体来说还是个新手(已经使用了 6 个月),所以如果我漏掉了一行明显的代码,我深表歉意。总结一下:最佳情况下,Spinner 下拉列表应显示两个预设字符串和数据库中的所有类别名称,并且仅打开一次。实际发生的情况是,它不断重复关闭/打开,并且每次打开时只显示数据库中的类别名称(但是预设字符串始终存在)。我非常感谢任何帮助!

如果有人需要,我可能会很快链接到我遇到的问题的 GIF。

更新:看来只有当我在下拉列表中选择默认值(这是两个预设字符串之一)时,才会发生此刷新故障。如果我选择另一个,则不会出现此故障。但仍然不确定为什么会发生。

第二次更新:我自己解决了这个问题,这是一个菜鸟错误,我对此感到非常尴尬。问题在于,在方法 onOpen() 中,我为 Spinner 设置了适配器,但随后在 Spinner 的 AdapterView.onItemSelectedListener 中,我调用了 onOpen() 再次导致递归循环破坏一切。修复方法是创建一个名为 onSelectNoSet() 的 onOpen() 重复方法,该方法执行相同的操作,只是不为微调器设置适配器,并让监听器调用该方法方法而不是 onOpen()

TL;DR 递归不好

最佳答案

第二次更新:我自己解决了这个问题,这是一个菜鸟错误,我对此感到非常尴尬。问题在于,在方法 onOpen() 中,我为 Spinner 设置了适配器,但随后在 Spinner 的 AdapterView.onItemSelectedListener 中,我调用了 onOpen() 再次导致递归循环破坏一切。修复方法是创建一个名为 onSelectNoSet() 的 onOpen() 重复方法,该方法执行相同的操作,只是不为微调器设置适配器,并让监听器调用该方法方法而不是 onOpen()

TL;DR 递归不好

关于java - 当我尝试将 Firebase 数据库中的项目包含在其项目列表中时,如何修复微调器不断关闭并重新打开的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55821808/

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