ValueEventListener未按预期工作

时间:2017-05-09 15:41:13

标签: android firebase firebase-realtime-database

我正在尝试在AutoCompleteTextView的Dropdown中显示存储在Firebase中的数据。为此,我使用 ValueEventListener 。根据 ValueEventListener 的文档,

  

您可以使用onDataChange()方法读取的静态快照   在给定路径上的内容,因为它们在事件发生时存在。   当连接并再次连接侦听器时,将触发此方法一次   每次包括儿童在内的数据都会发生变化。

不幸的是,在我的情况下, onDataChange()仅在数据被更改时触发(即,添加新数据时)。这意味着AutoCompleteTextView不显示下拉列表而不对Firebase中的数据进行任何更改。我想要的是, onDataChange()在第一次调用Listener时以及每次数据更改时触发。我想知道我哪里出错了。以下代码显示在Fragment

onCreateView
daTags.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            //Basically, this says "For each DataSnapshot *Data* in dataSnapshot, do what's inside the method.
            for (DataSnapshot tagNameSnapshot : dataSnapshot.getChildren()) {
                //Get the suggestion by childing the key of the string you want to get.
                String ValueTagName = tagNameSnapshot.child(getResources().getString(R.string.Child_AppData_Tags_TagName)).getValue(String.class);
                //Add ValueTagName (Value pulled from Firebase for the above Key) to TagList
                //Is better to use a List, because you don't know the size of the iterator returned by dataSnapshot.getChildren() to initialize the array
                tagList.add(ValueTagName);

                //Initialize AutoCompleteTextView and define Adapter
                ArrayAdapter<String> adapterAutoComplete = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, tagList);
                actv_tagName.setAdapter(adapterAutoComplete);

                //Get TagsCount using dataSnapshot and display TagsCount in TextView
                TagsCount = dataSnapshot.getChildrenCount() + "";
                tv_tagsCount.setText(TagsCount);
            }
        });

由于

1 个答案:

答案 0 :(得分:0)

我想我理解了这个问题。为了使它工作,我将不得不在 For循环

之外移动以下代码行
ArrayAdapter<String> adapterAutoComplete = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, tagList);
actv_tagName.setAdapter(adapterAutoComplete);

在For循环内部时,适配器会针对每个循环进行更新。将上述代码放在 For loop 之外,克服了这个问题。