过去几天我现在尝试在我的firebase android应用程序中实现一个建议作为你的类型功能但没有成功。所以这里是我的json示例数据,所有唯一键没有冲突
'
"ServiceTags" : {
"Android Apps Developer" : "Android Apps Developer",
"Arduino Expert" : "Arduino Expert",
"Blackberry Apps Developer" : "Blackberry Apps Developer",
"IOS Apps Developer" : "IOS Apps Developer",
"Symbian Apps Developer" : "Symbian Apps Developer",
"Windows Apps Developer" : "Windows Apps Developer"
}`
所以,我想要的是当用户开始输入例如Android自动填充文本视图中的字符“A”时,我想拉出所有以字符“A”开头的节点。
以下是我到目前为止所尝试的内容,但它始终会返回整个服务标签。非常令人沮丧......
AutoCompleteTextView serviceAutocompleteView;
serviceAutocompleteView.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)
{
//This is where I do the filtering as the user types
if (StringUtils.isNotEmpty(charSequence.toString())) {
pullOutTagsSuggestions(charSequence.toString());
}
}
@Override
public void afterTextChanged(Editable editable) {
}
});
@SuppressWarnings("unchecked")
public void pullOutTagsSuggestions(final String text) {
Query tagsReferences - FirebaseDatabase.getInstance().getReference().child("ServiceTags").orderByKey().startAt(StringUtils.capitalize(text));
tagsReferences.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if (dataSnapshot != null) {
String serviceString = dataSnapshot.getValue(String.class);
if (StringUtils.isNotEmpty(serviceString){
suggestions.add(serviceString);
}
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.select_dialog_item, suggestions);
serviceAutocompleteView.setAdapter(arrayAdapter);
}
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
StringUtils.capitalize()
函数仅将文本的第一个字符大写,StringUtils.isNotEmpty()
函数用于确保文本既不为null也不是“”;
我真诚地感谢任何帮助。谢谢
答案 0 :(得分:1)
我认为您需要在查询中添加.endAt语句,这将限制结果。由于您键入A,查询将返回以A开头的所有内容。如果您键入W,我认为您只会得到一个响应。
来自此
Query tagsReferences = FirebaseDatabase.getInstance().getReference().child("ServiceTags").orderByKey().startAt(StringUtils.capitalize(text));
到此
Query tagsReferences = FirebaseDatabase.getInstance().getReference().child("ServiceTags").orderByKey().startAt(StringUtils.capitalize(text)).endAt(StringUtils.capitalize(text)+ "\uf8ff");