Filter Data from RecyclerView Firebase

北城以北 提交于 2019-12-31 06:08:24

问题


I am trying to implement a searchview in my action bar and for that to filter the RecyclerView Data that I retrieved from Firebase. Right now I am looking for the code that I need to add to the recycleradapter to be able to filter the retrieved data. This is how I added the recyclerView to my 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);
}

Is there anybody who is able to help? Thank you :)

This is what I found searching for solutions but I don't get it how to adapt it to my code:

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

}


回答1:


You can use android's Filterable interface..

Follow this link for example

Firstly implements Filterable to your adapter class.. You can use another array list of same type you are using for storing and showing filtered items.

Implements Filterable interface's method getFilter()

Example Code...

@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();
        }
    };
}

Add search view into your toolbar....

@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();
}


来源:https://stackoverflow.com/questions/52900488/filter-data-from-recyclerview-firebase

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!