2017-05-09 85 views
1

我试图在AutoCompleteTextView的下拉菜单中显示存储在Firebase中的数据。为此,我正在使用ValueEventListener。据ValueEventListenerValueEventListener不按预期工作

文档

可以使用onDataChange()方法在给定的路径来读取的 内容的静态快照,因为他们在事件发生时存在。 每当数据(包括子项)发生更改时,此方法在连接侦听器时触发一次,并且再次触发 。

不幸的是,在我的情况onDataChange()被触发,只有当改变的数据(也就是,在添加新的数据)。这意味着AutoCompleteTextView不会显示下拉菜单,但不会更改Firebase中的数据。我想要的是,当监听器被调用并且每次数据改变时,onDataChange()第一次触发。我想知道我哪里出错了。下面的代码将出现内部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); 
      } 
     }); 

感谢

+0

'onDataChange()'方法确实对初始数据运行一次,然后再按照所述进行任何更改。我猜想问题是使用AutoCompleteTextView和Adapter,尽管我没有时间去测试它。尝试在onDataChange中放入日志消息或其他内容以确认onDataChange是否正在运行。 –

+0

'onDataChange(){}'不提供初始数据。但是,在更改远程数据库中的现有数据(添加新数据)之后,'onDataChange(){}'按预期工作(如上面的问题所述)。我想知道是什么导致'onDataChange(){}'不返回初始数据。 – user3314337

+0

您是如何验证onDataChange第一次未被触发的? –

回答

0

我想我明白这个问题。为了使它的工作,我将不得不移动代码的之外以下行For循环

ArrayAdapter<String> adapterAutoComplete = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, tagList); 
actv_tagName.setAdapter(adapterAutoComplete); 

当里面的for循环中,Adapter获取每个循环更新。将上面的代码放在之外For循环克服了这个问题。