从RecyclerView Firebase过滤数据 [英] Filter Data from RecyclerView Firebase

查看:83
本文介绍了从RecyclerView Firebase过滤数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在操作栏中实施searchview,以过滤从Firebase检索到的RecyclerView数据.现在,我正在寻找需要添加到recycleradapter中的代码,以便能够过滤检索到的数据. 这就是我将recyclerView添加到MainActivity的方式.

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

}

推荐答案

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

You can use android's Filterable interface..

例如请点击此链接

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

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.

实现可过滤接口的方法getFilter()

Implements Filterable interface's method 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();
        }
    };
}

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

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

这篇关于从RecyclerView Firebase过滤数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆