1

Firebaseに格納されたタグのリストがあります。私の断片の一つでは、MultiAutoCompleteTextView(MACTV)は、ユーザに関連するタグを選択させる。MultiAutoCompleteTextViewとFirebase

目的、

  • がFirebaseから タグを使用して(MACTVためArrayAdapterで使用される)配列を移入することです。
  • OnItemClickListenerを使用してMACTVから関連するタグを選択すると、選択したタグを Firebaseに保存する必要があります。

ここでは実装方法を説明します。 MACTV

MultiAutoCompleteTextView articleTags = (MultiAutoCompleteTextView) findViewById(R.id.mactv_tags); 
articleTags.requestFocus(); 
articleTags.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); 
articleTags.setAdapter(adapterMultiAutoComplete); 
ためArrayAdapter

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*/} 
    }); 
} 

コードを移入するAddValueEventListenerを使用し

ArrayAdapter<String> adapterMultiAutoComplete = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1); 

:MACTVためArrayAdapterを定義

保存Firebaseする選択したタグ閾値は残念ながら2のように定義されて

List<String> ArticleTags = new ArrayList<>(Arrays.asList(articleTags.getText().toString().split(", "))); 
DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("tags").setValue(ArticleTags); 

私はMACTVに入力を開始する場合、該当のタグがポップアップとして表示されません。私は間違って行くのです

+0

アダプタに項目を追加した後に、この行をonDataChange()メソッドの中に追加するだけです。 adapterMultiAutoComplete.notifyDataSetChanged(); –

+0

関連する(重複しない)answer with answer http://stackoverflow.com/a/39715702/5593959 –

答えて

1

ご参考までに、今月見た中で最も興味深いものです。

まず、このコードでは、tagsノード全体をデバイスに読み込みます。あなたは2Mのタグを持っていると想像してください(SOはありますか?)、このコードはまだ動作しますか? ;)

onDataChangeのコード(すべてのfirebaseコールバックのコードと同様)はワーカースレッドで呼び出されますが、アダプタメソッドはUIスレッドで呼び出される必要があります。

そして最後に、ここで私は解決策を参照してくださいする方法である:すべての

  1. あなたはクエリを使用する必要があります(あなたがdocsで詳細を読むことができます)
  2. まず、私たちは名前でタグをソートする必要があります。これは、ベースのクエリです:

    DatabaseReference baseRef = FirebaseDatabase.getInstance().getReference().child("tags").orderByChild("tagName"); 
    
  3. 次 - あなたは、コード

    articleTags.addTextChangedListener(new TextWatcher() { 
    
        @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 
    
        @Override 
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { 
    
         if (charSequence.length <3) return; 
    
         String searchTarget = charSequence.toString().toLowerCase(); 
         //Here magic happens) 
         baseRef.startAt(searchTarget).endAt(searchTarget + "\uf8ff").limitToFirst(20).addValueEventListener(new ValueEventListener() { 
          @Override 
          public void onDataChange(DataSnapshot dataSnapshot) { 
           //Handle executing this code in main thread yourself, answer will be too long with it 
           adapterMultiAutoComplete.removeAll(); 
           for (DataSnapshot data: dataSnapshot.getChildren()) { 
            adapterMultiAutoComplete.add(data.getValue(String.class)) 
           } 
           adapterMultiAutoComplete.notifyDatasetChanged(); 
          } 
    
          @Override 
          public void onCancelled(DatabaseError databaseError) { 
           Log.wtf("What a terrible failure!", databaseError.toException()); 
          } 
         }); 
    
        } 
    
        @Override public void afterTextChanged(Editable editable) {} 
    
    }); 
    

P.S:コードがテストされたことがないし、おそらく動作していない以下でごMultiAutoCompleteTextViewからTextWatcherを添付する必要があります。しかし、あなたはアイデアを得ました;)

+0

解決策に向けて別の視点を導入してくれてありがとう。以前はクエリを使用していなかった。しかし、どちらが良い方法ですか? _Case 01:_ Forループを使用して、使用可能なすべてのtagNamesをフェッチします。この場合、検索の速度が向上しますが、タグが多すぎると意味がありません。 02:_(クエリを使用)では検索時間がかかりすぎる(例えば、10個のタグを検索して追加するとき) – user3314337

+0

@ user3314337たとえば、制限を100に設定します。値が100未満の場合は、アダプタに保存し、より多くのクエリを作成しないでください) –

関連する問題