首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MultiAutoCompleteTextView和Firebase

MultiAutoCompleteTextView和Firebase
EN

Stack Overflow用户
提问于 2017-03-09 17:57:58
回答 1查看 144关注 0票数 1

我有一个标签列表存储在Firebase中。在我的一个片段中,MultiAutoCompleteTextView (MACTV)允许用户选择相关的标记。

目标是,

  • 使用Firebase的标记填充数组(用于MACTV的ArrayAdapter中)。
  • 一旦用户使用OnItemClickListener从MACTV中选择了相关的标签,所选的标签就需要保存到Firebase。

以下是我尝试实现的方法。

定义MACTV的ArrayAdapter

代码语言:javascript
复制
ArrayAdapter<String> adapterMultiAutoComplete = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1);

使用AddValueEventListener填充ArrayAdapter

代码语言:javascript
复制
if (fbUser != null) {
  dbTags.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("tagName")).getValue(String.class);
          //Add ValueTagName to ArrayAdapter
              adapterMultiAutoComplete.add(ValueTagName);
          }
       }

       @Override
       public void onCancelled(DatabaseError databaseError) {/*Do Nothing*/}
   });
}

MACTV代码

代码语言:javascript
复制
MultiAutoCompleteTextView articleTags = (MultiAutoCompleteTextView) findViewById(R.id.mactv_tags);
articleTags.requestFocus();
articleTags.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
articleTags.setAdapter(adapterMultiAutoComplete);

将选定的标记保存到Firebase

代码语言:javascript
复制
List<String> ArticleTags = new ArrayList<>(Arrays.asList(articleTags.getText().toString().split(", ")));
DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("tags").setValue(ArticleTags);

阈值被定义为2。不幸的是,当我开始在MACTV中输入时,没有相应的标签显示为弹出。

我哪里出错了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-09 20:35:54

顺便问个好问题!这是我这个月见过的最有趣的。

首先,使用此代码将整个tags节点加载到设备。想象一下,您有200万个标签(这样做了吗?),这段代码还能工作吗?)

第二件事是在工作线程上调用onDataChange内部的代码(以及所有firebase回调中的代码),但是应该在UI线程中调用适配器方法。

最后,下面是我对解决方案的看法:

  1. 您需要使用查询(可以在文档中阅读更多内容)
  2. 首先,我们需要根据名称对标签进行排序。这是基本查询: FirebaseDatabase.getInstance().getReference().child("tags").orderByChild("tagName");DatabaseReference baseRef =
  3. 下一步-您必须使用以下代码将TextWatcher附加到您的MultiAutoCompleteTextView ArticleTags.addTextChangedListener(新的TextWatcher() {@覆盖公共无效beforeTextChanged(CharSequence charSequence,int i,int i1,int i2) ) {} @覆盖公共无效onTextChanged(CharSequence charSequence,int i,int i1,int i2) { if (charSequence.length <3)返回;String searchTarget = charSequence.toString().toLowerCase();//在这里魔术发生) baseRef.startAt(searchTarget).endAt(searchTarget + "\uf8ff").limitToFirst(20).addValueEventListener(new ValueEventListener() {@重写公共空onDataChange(DataSnapshot dataSnapshot) {//亲自在主线程中执行此代码,答案将与adapterMultiAutoComplete.removeAll()一起太长;for ( adapterMultiAutoComplete.add(data.getValue(String.class))数据: dataSnapshot.getChildren()) {DataSnapshot} adapterMultiAutoComplete.notifyDatasetChanged();} @Override void onCancelled(DatabaseError databaseError) {Log.wtf(“多么可怕的失败!”,databaseError.toException()););}@覆盖公共无效afterTextChanged(可编辑) {} };

P.S.:代码从未测试过,而且可能不起作用。但你有这个想法;)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42702315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档