Firebase查询未更新 [英] Firebase Query not being updated

查看:43
本文介绍了Firebase查询未更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want my firebase database link to be updated depending on what the user keys in inside the searchview but the link is not updated unless I open another activity and jump back to it.I have attacked my code in the bottom. So how do I refresh it automatically ?

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

}

推荐答案

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

The standard way is to call notifyDataSetChanged() after setting your adapter to your list view

通知附加的观察者基础数据已更改,任何反映该数据集的View均应刷新自身.

Notifies the attached observers that the underlying data has been changed and any View reflecting the data set should refresh itself.

mAdapter.notifyDataSetChanged();

尽管我已经看到某些情况,仅使用此命令无效,并且必须遵循这两个命令.

Although I have seen some situations where only using this does not work and must be followed by these 2 commands.

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

如果其他所有方法都失败了,那么您可以选择毁掉并重新绘制列表视图,这是唯一可行的选择.

And if all else comes to fail falling back on destroying and redrawing the list view might be your only viable option.

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

看了一会儿之后,我刚刚注意到您缺少Firebase的侦听器.我假设您已经像列表一样在某个位置放置了它们,但是刷新功能失败了,您可以尝试在完成查询后重新启动侦听器.

EDIT : After looking at it a while more I just noticed you're missing listeners for your firebase. I assume you already have them somewhere as you already have the list but failing your refresh functions, what you can try is restarting the listeners whenever you're done with a query.

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

这篇关于Firebase查询未更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆