【问题标题】:How to retrieve an itemName from firebase and use it for a searchView?如何从 firebase 检索 itemName 并将其用于 searchView?
【发布时间】:2017-12-08 17:39:46
【问题描述】:

我尝试从 Firebase 中检索 itemName 并尝试将其用于 searchView。而且我不知道我在以下代码中的逻辑有什么问题。

So here is my database

这是我的数据快照:-

 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) {

        }
    });
}

和searchview功能

@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”类,因为它正在我的数据快照中使用:-

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;

    }
}

我还可以为我更改数据类型的 searchList 创建一个新类。

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:
     //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) {
    
        }
    });
    }
    

    尝试上述方法,将clear() 放在onDataChange 之前,这就是它不起作用的原因,每次您尝试检索时,您也在清除列表。将clear() 放在前面,以避免启动活动时重复值。

    【讨论】:

    • 谢谢,但 itemFinalList 和 itemname 的类型不同。
    • 使用字符串类型的数组列表
    • 适配器呢?
    • 使用ArrayAdapter,因为您只检索itemname。在此之前尝试您的代码,但只需从那里删除 clear() 并查看您得到的结果
    • 我已经用“itemList”类更新了我的帖子。请看一下。谢谢,我会试试你的建议。
    猜你喜欢
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2018-01-24
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多