我有一个标签列表存储在Firebase中。在我的一个片段中,MultiAutoCompleteTextView (MACTV)允许用户选择相关的标记。
目标是,
以下是我尝试实现的方法。
定义MACTV的ArrayAdapter
ArrayAdapter<String> adapterMultiAutoComplete = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1);使用AddValueEventListener填充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*/}
});
}MACTV代码
MultiAutoCompleteTextView articleTags = (MultiAutoCompleteTextView) findViewById(R.id.mactv_tags);
articleTags.requestFocus();
articleTags.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
articleTags.setAdapter(adapterMultiAutoComplete);将选定的标记保存到Firebase
List<String> ArticleTags = new ArrayList<>(Arrays.asList(articleTags.getText().toString().split(", ")));
DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("tags").setValue(ArticleTags);阈值被定义为2。不幸的是,当我开始在MACTV中输入时,没有相应的标签显示为弹出。
我哪里出错了?
发布于 2017-03-09 20:35:54
顺便问个好问题!这是我这个月见过的最有趣的。
首先,使用此代码将整个tags节点加载到设备。想象一下,您有200万个标签(这样做了吗?),这段代码还能工作吗?)
第二件事是在工作线程上调用onDataChange内部的代码(以及所有firebase回调中的代码),但是应该在UI线程中调用适配器方法。
最后,下面是我对解决方案的看法:
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.:代码从未测试过,而且可能不起作用。但你有这个想法;)
https://stackoverflow.com/questions/42702315
复制相似问题