1

Firebase에 저장된 태그 목록이 있습니다. 내 단편 중 하나 인 MultiAutoCompleteTextView (MACTV)을 사용하면 사용자가 관련 태그를 선택할 수 있습니다.MultiAutoCompleteTextView 및 Firebase

목적,

  • 는 중포 기지에서 태그를 사용하여 (MACTV위한 ArrayAdapter와에 사용) 배열을 채우는입니다.
  • OnItemClickListener를 사용하여 MACTV에서 관련 태그를 선택하면 선택한 태그를 Firebase에 저장해야합니다.

다음은 구현 방법입니다.

MACTV의 ArrayAdapter와 정의 :

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

MultiAutoCompleteTextView articleTags = (MultiAutoCompleteTextView) findViewById(R.id.mactv_tags); 
articleTags.requestFocus(); 
articleTags.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); 
articleTags.setAdapter(adapterMultiAutoComplete); 
MACTV
의 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을 사용하여

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

내가 MACTV에 입력을 시작하면 2. 불행히도 관련 태그 팝업으로 표시하지 않기 때문에 임계 값을 정의 중포 기지 선택된 태그를 저장

.

어디서 잘못 되었나요?

+0

어댑터에 항목을 추가 한 후에이 행을 onDataChange() 메소드 내에 추가하면됩니다. adapterMultiAutoComplete.notifyDataSetChanged(); –

+0

관련 항목 (중복 아님) 답변 포함 질문 http://stackoverflow.com/a/39715702/5593959 –

답변

1

현재 멋진 질문입니다. 이번 달에 내가 가장 재미있는 것을 보았습니다.

먼저이 코드를 사용하여 전체 tags 노드를 기기에로드합니다. 2M의 태그를 가지고 있다고 상상해보십시오 (그렇습니까?),이 코드는 여전히 작동합니까? ;)

onDataChange 내 코드 (모든 firebase 콜백의 코드뿐만 아니라)는 작업자 스레드에서 호출되지만 어댑터 스레드는 UI 스레드에서 호출되어야합니다.

  1. 당신은 모든
  2. 첫째, 우리는 이름으로 태그를 정렬 할 필요가 (당신이 docs에서 자세한 내용을보실 수 있습니다) 쿼리를 사용해야합니다 :

    그리고 마지막으로, 여기에 내가 솔루션을 참조하는 방법입니다 . 그래서이 기본 쿼리입니다 :

    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를 다음으로 MultiAutoCompleteTextViewTextWatcher를 첨부해야합니다 : 코드 테스트 결코 아마 작동하지 않습니다.하지만 당신은 아이디어가있어;)

+0

솔루션에 대한 대안적인 견해를 소개해 주셔서 감사합니다. 이전에 검색어를 사용하지는 않았습니다. 그러나 더 좋은 방법은 무엇입니까? _Case 01 : _ For 루프를 사용하여 사용 가능한 모든 tagNames를 가져옵니다. 이 경우 검색 횟수를 늘리면 좋지만 너무 많은 태그를 포함하면 의미가 없습니다. _Case 02 : _ (검색어 사용)에서 검색 시간이 너무 많이 걸렸습니다 (예 : 검색하고 10 개의 태그를 추가하려는 경우) – user3314337

+0

@ user3314337 예를 들어 제한을 100으로 설정합니다. 값이 100 개 미만인 경우 어댑터에 저장하고 더 많은 쿼리를 작성하지 마십시오. –