首页 > 解决方案 > 从 RecyclerView Firebase 过滤数据

问题描述

我正在尝试在我的操作栏中实现一个搜索视图,并为此过滤我从 Firebase 检索到的 RecyclerView 数据。现在我正在寻找我需要添加到 recycleradapter 以便能够过滤检索到的数据的代码。这就是我将 recyclerView 添加到我的 MainActivity 的方式。

        Query query = mRef.orderByChild("city");
        // everything else
        FirebaseRecyclerAdapter<City, CityViewHolder> firebaseRecyclerAdapter =
                new FirebaseRecyclerAdapter<City, CityViewHolder>(
                        City.class,
                        R.layout.city_starter,
                        CityViewHolder.class,
                        query
                ) {
                    @Override
                    protected void populateViewHolder(CityViewHolder viewHolder, City city, int position) {
                        viewHolder.setDetails(getApplicationContext(),
                                city.getCity());
                    }

                    // for click of parent item
                    @Override
                    public CityViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

                        CityViewHolder viewHolder = super.onCreateViewHolder(parent, viewType);

                        viewHolder.setOnClickListener(new CityViewHolder.ClickListener() {
                            @Override
                            public void onItemClick(View view, int position) {

                                //get Data from Firebase
                                String cCity = getItem(position).getCity();


                                // pass this data to new activity
                                Intent secondMainActivity = new Intent(view.getContext(), SecondMainActivity.class);
                                secondMainActivity.putExtra("city", cCity);
                                startActivity(secondMainActivity);
                            }

                            @Override
                            public void onItemLongClick(View view, int position) {
                                // possible to implement another way of interacting for a long click
                            }
                        });

                        return viewHolder;
                    }
                };

        // set adapter to recyclerview
        mRecyclerView.setAdapter(firebaseRecyclerAdapter);
}

有没有人可以提供帮助?谢谢 :)

这是我在寻找解决方案时发现的,但我不知道如何使其适应我的代码:

public void filter(String text) {
items.clear();
if(text.isEmpty()){
    items.addAll(itemsCopy);
} else{
    text = text.toLowerCase();
    for(PhoneBookItem item: itemsCopy){
        if(item.name.toLowerCase().contains(text) || item.phone.toLowerCase().contains(text)){
            items.add(item);
        }
    }
}
notifyDataSetChanged();

}

标签: firebasefirebase-realtime-databaseandroid-recyclerviewsearchviewfirebaseui

解决方案


你可以使用android的Filterable接口..

以这个链接为例

首先implements Filterable是您的适配器类。您可以使用另一个与您使用的相同类型的数组列表来存储和显示过滤的项目。

实现 Filterable 接口的方法getFilter()

示例代码...

@Override
public Filter getFilter() {
    return new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence charSequence) {
            String charString = charSequence.toString();
            if (charString.isEmpty()) {
                contactListFiltered = contactList;
            } else {
                List<Contact> filteredList = new ArrayList<>();
                for (Contact row : contactList) {

                    // name match condition. this might differ depending on your requirement
                    // here we are looking for name or phone number match
                    if (row.getName().toLowerCase().contains(charString.toLowerCase()) || row.getPhone().contains(charSequence)) {
                        filteredList.add(row);
                    }
                }

                contactListFiltered = filteredList;
            }

            FilterResults filterResults = new FilterResults();
            filterResults.values = contactListFiltered;
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
            contactListFiltered = (ArrayList<Contact>) filterResults.values;

            // refresh the list with filtered data
            notifyDataSetChanged();
        }
    };
}

将搜索视图添加到您的工具栏中....

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);

    // Associate searchable configuration with the SearchView
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchView = (SearchView) menu.findItem(R.id.action_search)
            .getActionView();
    searchView.setSearchableInfo(searchManager
            .getSearchableInfo(getComponentName()));
    searchView.setMaxWidth(Integer.MAX_VALUE);

    // listening to search query text change
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            // filter recycler view when query submitted
            mAdapter.getFilter().filter(query);
            return false;
        }

        @Override
        public boolean onQueryTextChange(String query) {
            // filter recycler view when text is changed
            mAdapter.getFilter().filter(query);
            return false;
        }
    });
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_search) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

@Override
public void onBackPressed() {
    // close search view on back button pressed
    if (!searchView.isIconified()) {
        searchView.setIconified(true);
        return;
    }
    super.onBackPressed();
}

推荐阅读