【问题标题】:Filter Data from RecyclerView Firebase从 RecyclerView Firebase 过滤数据
【发布时间】:2019-03-24 19:48:17
【问题描述】:

我正在尝试在我的操作栏中实现一个搜索视图,并为此过滤我从 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();

}

【问题讨论】:

    标签: firebase firebase-realtime-database android-recyclerview searchview firebaseui


    【解决方案1】:

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

    Follow this link for example

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 2021-03-14
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      相关资源
      最近更新 更多