gpt4 book ai didi

java - 在 Android 中使用 Listview 从 Firebase 搜索数据

转载 作者:行者123 更新时间:2023-12-02 12:10:00 24 4
gpt4 key购买 nike

我有一个 Firebase 数据库,它能够在 ListView 中显示数据。所有数据都包含在对象中,对象在其中获取数据。我希望能够将示例“Lars”写入搜索栏中,然后它必须更新 ListView 以仅包含包含该字符串的那些对象,如果我从搜索栏中删除所有内容,它应该再次显示所有内容。第一个 for 循环有效,第二个 for 循环是我搜索数据的尝试。我的 Firebase 结构如下所示:enter image description here

    private DatabaseReference mDatabaseReference;
private ListView mUserList;
private SearchView searchModule;

private ArrayList<String> mUsernames = new ArrayList<>();
private ArrayList<String> filteredUsernames = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_existing_customer);

mDatabaseReference = FirebaseDatabase.getInstance().getReference("Buyers");

mUserList = (ListView) findViewById(R.id.UserListView);


searchModule = (SearchView) findViewById(R.id.SearchTab);

final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, mUsernames);

final ArrayAdapter<String> filteredArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, filteredUsernames);

mUserList.setAdapter(arrayAdapter);

mDatabaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {

for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {

Map<String, String> map = (Map<String, String>) childSnapshot.getValue();
Log.v("YourValue,","Map value is:" +map.toString());
Log.d("TAG", "onChildAdded:" + dataSnapshot.getKey());
Buyers buyerList = new Buyers(map);
mUsernames.add(buyerList.getData());
}
CharSequence searchValue = (CharSequence) searchModule;
arrayAdapter.getFilter().filter(searchValue);

arrayAdapter.notifyDataSetChanged();
}


@Override
public void onCancelled(DatabaseError databaseError) {

}
});

}

最佳答案

三件事:

  1. 您没有向filteredUsernames 添加任何数据。就像您对 mUsernames 所做的那样,您应该将数据添加到filteredUsernames 中。
  2. getFilter是ArrayAdapter的一个方法,你应该在filteredArrayAdapter上使用它
  3. 您可以使用监听器来监听查询的任何更改并应用过滤器

    for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
    Map<String, String> map = (Map<String, String>) childSnapshot.getValue();
    Buyers buyerList = new Buyers(map);
    filteredUsernames.add(buyerList.getData());
    }

    searchModule.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
    @Override
    public boolean onQueryTextSubmit(String query) {
    return false;
    }

    @Override
    public boolean onQueryTextChange(String newText) {
    filteredArrayAdapter.getFilter().filter(newText);
    filteredArrayAdapter.notifyDataSetChanged();
    return true;
    }
    });

这或多或少应该是这样的。但是,由于过滤器应用于适配器,您可以注意到filteredUserNames 和mUsernames 是相同的,因此您实际上不需要两个列表。或者,如果您需要过滤器,您也可以使用 if 语句和 contains 检查手动执行过滤。

关于java - 在 Android 中使用 Listview 从 Firebase 搜索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46613447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com