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

Search data from Firebase using Listview in Android

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

    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 语句和包含检查手动进行过滤。