Фильтрация данных из RecyclerView Firebase - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь реализовать вид поиска в моей панели действий и для этого отфильтровать данные RecyclerView, полученные из Firebase.Прямо сейчас я ищу код, который мне нужно добавить в recycleradapter, чтобы иметь возможность фильтровать полученные данные.Вот как я добавил в свой MainActivity RecyclerView.

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

}

1 Ответ

0 голосов
/ 25 октября 2018

Вы можете использовать фильтруемый интерфейс Android.

Перейдите по этой ссылке, например,

Сначала implements 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();
}
...