我是android studio和firebase的新手。 我正在尝试制作食谱配方。 现在,我在firebase中有一个成分列表作为数组形式。
我希望用户从现有列表中搜索他们不喜欢的成分。 为此,必须进行自动完成搜索。
我想要的是什么;
显示来自firebase的所有成分的应用程序。我怎么能这样做?
例如,如果用户不喜欢黄瓜并且火焰列表中有黄瓜,胡萝卜,猕猴桃等,应用程序应显示来自firebase的所有成分,但是当用户键入c,app时显示黄瓜和胡萝卜,当他输入铜时,它只显示黄瓜。他可以选择黄瓜并将这种成分放入“不喜欢”列表中。我怎么能这样做?
任何评论都会对我有所帮助。
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();
}
}
});
}
}
答案 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();
}
}
});
测试我的