Java 如何从firebase检索itemName并将其用于searchView?
我尝试从Firebase检索itemName,并尝试将其用于searchView。我不知道下面代码中的逻辑出了什么问题 这是我的数据快照:-Java 如何从firebase检索itemName并将其用于searchView?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我尝试从Firebase检索itemName,并尝试将其用于searchView。我不知道下面代码中的逻辑出了什么问题 这是我的数据快照:- protected void onStart() { super.onStart(); databaseItems.child("items").orderByChild("itemName").addValueEventListener(new ValueEventListener() { @Override
protected void onStart() {
super.onStart();
databaseItems.child("items").orderByChild("itemName").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
itemFinalList.clear();
for (DataSnapshot itemSnapShot : dataSnapshot.getChildren()) {
ItemInventory itemInventoryTest = itemSnapShot.getValue(ItemInventory.class);
itemFinalList.add(itemInventoryTest);
}
ItemList adapter = new ItemList(SearchActivity.this, itemFinalList);
listFinal.setAdapter(adapter);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
和搜索视图功能
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_search, menu);
MenuItem item = menu.findItem(R.id.menuSearch);
SearchView searchView = (SearchView) item.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return false;
}
});
return super.onCreateOptionsMenu(menu);
}
这是我的“itemList”类,因为它在我的datasnapshot中使用:-
public class ItemList extends ArrayAdapter<ItemInventory> {
private Activity context;
private List<ItemInventory> items;
public ItemList(Activity context, List<ItemInventory> items) {
super(context, R.layout.list_layout, items);
this.context = context;
this.items = items;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View listViewItem = inflater.inflate(R.layout.list_layout, null, true);
TextView textViewCategory = (TextView) listViewItem.findViewById(R.id.textViewCategory);
TextView textViewName = (TextView) listViewItem.findViewById(R.id.textViewName);
TextView textViewCost = (TextView) listViewItem.findViewById(R.id.textViewCost);
final TextView textViewCount = (TextView) listViewItem.findViewById(R.id.textViewCount);
ItemInventory itemInventoryTest = items.get(position);
textViewCategory.setText(itemInventoryTest.getItemCategory());
textViewName.setText(itemInventoryTest.getItemName());
textViewCost.setText(itemInventoryTest.getItemCost());
textViewCount.setText(itemInventoryTest.getItemCount());
return listViewItem;
}
}
公共类ItemList扩展了ArrayAdapter{
私人活动语境;
私人清单项目;
公共项列表(活动上下文、列表项){
超级(上下文、右布局、列表和布局、项目);
this.context=上下文;
这个项目=项目;
}
@非空
@凌驾
公共视图getView(int位置,@Nullable视图convertView,@NonNull视图组父级){
LayoutInflater充气器=上下文。getLayoutInflater();
View listViewItem=充气机。充气(R.layout.list\u布局,null,true);
TextView textViewCategory=(TextView)listViewItem.findViewById(R.id.textViewCategory);
TextView textViewName=(TextView)listViewItem.findViewById(R.id.textViewName);
TextView textViewCost=(TextView)listViewItem.findViewById(R.id.textViewCost);
最终TextView textViewCount=(TextView)listViewItem.findViewById(R.id.textViewCount);
ItemInventory ItemInventory测试=items.get(位置);
textViewCategory.setText(itemInventoryTest.getItemCategory());
textViewName.setText(itemInventoryTest.getItemName());
textViewCost.setText(itemInventoryTest.getItemCost());
textViewCount.setText(itemInventoryTest.getItemCount());
返回listViewItem;
}
}
我还可以为searchList创建一个新类,在其中更改我的数据类型。//在类声明下执行以下操作:
//under class declaration do this:
private ArrayList<String> itemlists;
itemLists=new ArrayList<String>();
databaseItems.child("items").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot itemSnapShot : dataSnapshot.getChildren()) {
String itemname=itemSnapShot.child("itemName").getValue().toString();
itemlists.add(itemname);
ArrayAdapter adapter = new ArrayAdapter(SearchActivity.this,android.R.layout.simple_list_item_1 itemlists);
listFinal.setAdapter(adapter);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
私有ArrayList项目列表;
ItemList=新的ArrayList();
databaseItems.child(“items”).addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot itemSnapShot:DataSnapshot.getChildren()){
字符串itemname=itemsnashot.child(“itemname”).getValue().toString();
itemlists.add(itemname);
ArrayAdapter=新的ArrayAdapter(SearchActivity.this,android.R.layout.simple\u list\u item\u 1 itemlists);
setAdapter(适配器);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
尝试上面的方法,将
clear()
放在onDataChange
之前,这就是它不起作用的原因,每次尝试检索时,您也在清除列表。将clear()
放在前面,以避免启动活动时出现重复值。谢谢,但是itemFinalList和itemname不是相同的类型。使用StringName类型的arraylist适配器如何?使用ArrayAdapter
,因为您只检索itemname
。在执行此操作之前,请尝试您的代码,但只需从中删除clear()
,然后查看您得到了什么。我已使用“itemList”类更新了我的帖子。请看。谢谢,我试试你的建议。