如何在Android上使用firebase键入时实施Suggest

时间:2016-09-11 06:38:40

标签: android firebase firebase-realtime-database

过去几天我现在尝试在我的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也不是“”;

我真诚地感谢任何帮助。谢谢

1 个答案:

答案 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");

请参阅https://stackoverflow.com/a/39715702/2330272