我希望根据用户在searchview中键入的内容更新firebase数据库链接,但是除非打开另一个活动并跳回该链接,否则该链接不会更新。我在底部攻击了我的代码。那么如何自动刷新呢?
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);
}
答案 0 :(得分:1)
标准方法是在将适配器设置为列表视图之后调用notifyDataSetChanged()
通知附加的观察者基础数据已更改,任何反映数据集的View均应刷新自身。
mAdapter.notifyDataSetChanged();
尽管我已经看到某些情况,但仅使用此功能不起作用,并且必须遵循这两个命令。
lv.invalidateViews();
lv.scrollBy(0, 0);
如果其他所有方法都失败了,那么您可以选择破坏和重新绘制列表视图。
lv.destroyDrawingCache();
lv.setVisibility(ListView.INVISIBLE);
lv.setVisibility(ListView.VISIBLE);
编辑:看了一会儿之后,我刚刚注意到您缺少Firebase的侦听器。我假设您已经像列表一样在某个位置放置了它们,但是刷新功能失败了,您可以尝试在完成查询后重新启动侦听器。
lv.setAdapter(mAdapter);
mAdapter.stopListening();
mAdapter.startListening();