【问题标题】:Firebase Query not being updatedFirebase 查询未更新
【发布时间】:2019-01-30 08:47:54
【问题描述】:

我希望我的 firebase 数据库链接根据用户在 searchview 中键入的内容进行更新,但链接不会更新,除非我打开另一个活动并跳回它。我在底部攻击了我的代码。那么如何自动刷新呢?

sv.setOnQueryTextListener(new SearchView.OnQueryTextListener()
    {
        @Override
        public boolean onQueryTextSubmit(String query) {
            query = sv.getQuery().toString();
            Toast.makeText(MainMenu.this,query, Toast.LENGTH_SHORT).show();
            makeItem();
            return true;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            return false;
        }

    });

 public void makeItem ()
{
    lv = findViewById(R.id.listView);
    db = FirebaseDatabase.getInstance().getReferenceFromUrl("https://vsem-inventory.firebaseio.com/ItemList").orderByChild("ProductName").startAt(query).endAt(query+"\uf8ff");
    FirebaseListOptions<ItemObject> options = new FirebaseListOptions.Builder<ItemObject>()
            .setLayout(R.layout.content_main_menu_list)
            .setQuery(db,ItemObject.class)
            .build();
    mAdapter = new FirebaseListAdapter<ItemObject>(options) {
        @Override
        protected void populateView(@NonNull View v, @NonNull ItemObject model, int position) {
            final TextView tvAmount = v.findViewById(R.id.amount);
            final TextView tvName = v.findViewById(R.id.name);
            final TextView tvSerial = v.findViewById(R.id.serialNo);
            final TextView tvSupplier = v.findViewById(R.id.supplierName);
            final ImageView more = v.findViewById(R.id.more);
            ImageView statusimg =  v.findViewById(R.id.status);
            Drawable paidIcon = v.getResources().getDrawable(R.drawable.succes);
            Drawable lateIcon = v.getResources().getDrawable(R.drawable.late);
            tvName.setText(model.getProductName());
            tvSerial.setText(model.getSerialNo());
            tvAmount.setText(model.getQuantity());
            tvSupplier.setText(model.getModel());
           final  String Remarks = model.getRemarks();
            final String cat = model.getCategory();
             if(model.getQuantity().equals("0"))
                statusimg.setImageDrawable(lateIcon);
            else
                statusimg.setImageDrawable(paidIcon);
            more.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v) {
                    String serialNo = tvSerial.getText().toString();
                    String itemName = tvName.getText().toString();
                    String quan = tvAmount.getText().toString();
                    String supplier = tvSupplier.getText().toString();
                    showMenu(itemName,more,serialNo,quan,supplier,cat,Remarks);
                }
            });
        }
    };

    lv.setAdapter(mAdapter);

}

【问题讨论】:

    标签: firebase firebase-realtime-database


    【解决方案1】:

    标准方法是在将适配器设置为列表视图后调用 notifyDataSetChanged()

    通知附加的观察者底层数据已更改,任何反映数据集的视图都应自行刷新。

    mAdapter.notifyDataSetChanged();
    

    虽然我见过一些情况,只使用 this 是行不通的,必须跟这 2 个命令。

    lv.invalidateViews();
    lv.scrollBy(0, 0);
    

    如果一切都失败了,那么依靠销毁和重绘列表视图可能是您唯一可行的选择。

    lv.destroyDrawingCache();
    lv.setVisibility(ListView.INVISIBLE);
    lv.setVisibility(ListView.VISIBLE);
    

    编辑:看了一会儿后,我才注意到你的 firebase 缺少听众。我假设您已经在某处拥有它们,因为您已经拥有列表但刷新功能失败,您可以尝试在完成查询时重新启动侦听器。

    lv.setAdapter(mAdapter);
    mAdapter.stopListening();
    mAdapter.startListening();
    

    【讨论】:

    • 感谢您的回答,您在编辑部分的回答有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多