android studio自动完成从firebase搜索

时间:2018-01-21 15:14:46

标签: android firebase firebase-realtime-database

我是android studio和firebase的新手。 我正在尝试制作食谱配方。 现在,我在firebase中有一个成分列表作为数组形式。

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

我想要的是什么;

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

  2. 例如,如果用户不喜欢黄瓜并且火焰列表中有黄瓜,胡萝卜,猕猴桃等,应用程序应显示来自firebase的所有成分,但是当用户键入c,app时显示黄瓜和胡萝卜,当他输入铜时,它只显示黄瓜。他可以选择黄瓜并将这种成分放入“不喜欢”列表中。我怎么能这样做?

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

    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();
                }
            }
        });
    
    }
    
    }
    

2 个答案:

答案 0 :(得分:0)

您需要使用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

答案 1 :(得分:0)

假设搜索是一个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();
        }
    }
});

测试我的