【问题标题】:android studio autocomplete search from firebase来自firebase的android studio自动完成搜索
【发布时间】:2018-06-30 07:11:27
【问题描述】:

我是 android studio 和 firebase 的新手。 我正在尝试制作食物食谱应用程序。 现在,我在 firebase 中有一个以数组形式存在的成分列表。

我希望用户从现有列表中搜索他们不喜欢的成分。 为此,需要自动完成搜索。

我想要的是;

  1. 显示来自 firebase 的所有成分的应用程序。我该怎么做?

  2. 1234563和胡萝卜,当他输入 cu 时,它只显示黄瓜。他可以选择黄瓜并将这种成分放入“不喜欢列表”中。我该怎么做?

任何评论都会对我有所帮助。

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;


public class SearchActivity extends AppCompatActivity {



private EditText search;
private ListView listview;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);
    search = (EditText) findViewById(R.id.search);

    final ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1);
    listview = (ListView) findViewById(R.id.listview1);
    listview.setAdapter(adapter);

    for (int i = 1; i < 40; i++) {

        final String num = Integer.toString(i);
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        final DatabaseReference myRef = database.getReference().child("ingredients").child(num);


        myRef.child("ingredients").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    String name = dataSnapshot.getValue().toString();
                    adapter.add(name);
                } else {
                    System.out.println("nein");
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
    }

    search.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {

        }
        @Override
        public void afterTextChanged(Editable s) {

            String filterText = s.toString();
            if(filterText.length()>0){

                listview.setFilterText(filterText);
            }else{
                listview.clearTextFilter();
            }
        }
    });

}

}

【问题讨论】:

  • 你在上面提到的代码中遇到了什么问题?
  • 该代码未从 firebase 获取成分列表
  • 因为你需要共享firebase实时数据库的数据结构(firebase数据库成分节点值的截图)

标签: android firebase firebase-realtime-database


【解决方案1】:

您需要使用 AutoCompleteTextView 而不是 EditText 进行搜索。 根据用户键入时应更新适配器的成分数量,您应该执行以下操作:

//Declare the variables
    private AutoCompleteTextView suggestion_box;
    private ArrayAdapter<String> adapter;
//this should be in onCreate (for activity) or in onCreateView (for fragment)
suggestion_box = (AutoCompleteTextView) mView.findViewById(R.id.suggestion_box);

对于 firebase,您应该实现 OnComplete 来填充适配器并更新建议框 检查this

【讨论】:

    【解决方案2】:

    假设搜索是一个 AutoCompleteTextView,您可以像这样将适配器添加到搜索中

    private AutoCompleteTextView search;
    private ArrayAdapter<String> adapter;
    
    search.setAdapter(adapter);
    

    只需评论这段代码

    search.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
        }
        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
    
        }
        @Override
        public void afterTextChanged(Editable s) {
    
            String filterText = s.toString();
            if(filterText.length()>0){
    
                listview.setFilterText(filterText);
            }else{
                listview.clearTextFilter();
            }
        }
    });
    

    测试我的。

    【讨论】:

      猜你喜欢
      • 2018-02-23
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 2021-12-03
      • 2014-06-15
      • 2015-07-20
      相关资源
      最近更新 更多