Android 正在尝试创建将使用searchview筛选的recyclerview

Android 正在尝试创建将使用searchview筛选的recyclerview,android,android-recyclerview,searchview,android-databinding,Android,Android Recyclerview,Searchview,Android Databinding,我一直在尝试创建一个将使用searchview进行过滤的recyclerview。它显示列表中我提供的所有项目,而不是筛选。我也在使用数据绑定。我犯了一个大错,或者我错过了什么。有什么建议吗 这是我的密码 片段类 package com.batch.mcs.finalproject; import android.arch.lifecycle.Observer; import android.arch.lifecycle.ViewModelProviders; import andro

我一直在尝试创建一个将使用searchview进行过滤的recyclerview。它显示列表中我提供的所有项目,而不是筛选。我也在使用数据绑定。我犯了一个大错,或者我错过了什么。有什么建议吗

这是我的密码

片段类

    package com.batch.mcs.finalproject;

import android.arch.lifecycle.Observer;
import android.arch.lifecycle.ViewModelProviders;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.SearchView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.batch.mcs.finalproject.adapters.SearchFragmentRecyclerViewAdapter;
import com.batch.mcs.finalproject.databinding.FragmentSearchBinding;
import com.batch.mcs.finalproject.models.Group;
import com.batch.mcs.finalproject.viewmodel.AppViewModel;

import java.util.List;

public class SearchFragment extends BaseFragment {

    FragmentSearchBinding fragmentSearchBinding;
    View view;
    SearchFragmentRecyclerViewAdapter adapter;
    RecyclerView recyclerView;

    public static SearchFragment getInstance(){
        return new SearchFragment();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    fragmentSearchBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_search, container, false);

    view = fragmentSearchBinding.getRoot();

    AppViewModel appViewModel = ViewModelProviders.of(this).get(AppViewModel.class);
    appViewModel.initMockGroups();
    appViewModel.getLiveGroupAll().observe(this, new Observer<List<Group>>() {
        @Override
        public void onChanged(@Nullable List<Group> groups) {

            SearchView searchView = fragmentSearchBinding.svSearchLayout;
            search(searchView);

            adapter = new SearchFragmentRecyclerViewAdapter(groups, getContext());
            recyclerView = fragmentSearchBinding.rvSearchLayout;
            recyclerView.setHasFixedSize(false);
            recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
            recyclerView.setAdapter(adapter);
        }
    });

    return view;
}

private void search(SearchView searchView) {

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {

            adapter.getFilter().filter(newText);
            return true;
        }
    });
}
package com.batch.mcs.finalproject;
导入android.arch.lifecycle.Observer;
导入android.arch.lifecycle.ViewModelProviders;
导入android.databinding.DataBindingUtil;
导入android.os.Bundle;
导入android.support.annotation.Nullable;
导入android.support.v7.widget.LinearLayoutManager;
导入android.support.v7.widget.RecyclerView;
导入android.support.v7.widget.SearchView;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入com.batch.mcs.finalproject.adapters.SearchFragmentRecycleServiceAdapter;
导入com.batch.mcs.finalproject.databinding.FragmentSearchBinding;
导入com.batch.mcs.finalproject.models.Group;
导入com.batch.mcs.finalproject.viewmodel.AppViewModel;
导入java.util.List;
公共类SearchFragment扩展了BaseFragment{
FragmentSearchBinding FragmentSearchBinding;
视图;
SearchFragmentRecycleServiceAdapter适配器;
回收视图回收视图;
公共静态SearchFragment getInstance(){
返回新的SearchFragment();
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
fragmentSearchBinding=DataBindingUtil.inflate(充气机,R.layout.fragment\u搜索,容器,false);
view=fragmentSearchBinding.getRoot();
AppViewModel AppViewModel=ViewModelProviders.of(this.get)(AppViewModel.class);
appViewModel.initMockGroups();
appViewModel.getLiveGroupAll().observe(这是一个新的观察者(){
@凌驾
公共void onChanged(@Nullable列表组){
SearchView SearchView=fragmentSearchBinding.svSearchLayout;
搜索(searchView);
adapter=newsearchFragmentRecycleServiceAdapter(组,getContext());
recyclerView=fragmentSearchBinding.rvSearchLayout;
recyclerView.setHasFixedSize(false);
setLayoutManager(新的LinearLayoutManager(getActivity());
recyclerView.setAdapter(适配器);
}
});
返回视图;
}
专用无效搜索(SearchView SearchView){
searchView.setOnQueryTextListener(新的searchView.OnQueryTextListener(){
@凌驾
公共布尔值onQueryTextSubmit(字符串查询){
返回false;
}
@凌驾
公共布尔onQueryTextChange(字符串newText){
adapter.getFilter().filter(newText);
返回true;
}
});
}
SearchFragmentRecycleServiceAdapter类

    package com.batch.mcs.finalproject.adapters;

import android.content.Context;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;

import com.batch.mcs.finalproject.BR;
import com.batch.mcs.finalproject.R;
import com.batch.mcs.finalproject.models.Group;

import java.util.ArrayList;
import java.util.List;

public class SearchFragmentRecyclerViewAdapter extends RecyclerView.Adapter<SearchFragmentRecyclerViewAdapter.RecyclerViewHolder> implements Filterable {

    private List<Group> groups;
    private List<Group> filteredGroups;
    private Context context;

    public SearchFragmentRecyclerViewAdapter(List<Group> groups, Context context){
        this.groups = groups;
        this.filteredGroups = groups;
        this.context = context;
    }

    @NonNull
    @Override
    public RecyclerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
        View itemView = inflater.inflate(R.layout.recyclerview_group_information_item,viewGroup, false);
        return new RecyclerViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position) {
        Group group = filteredGroups.get(position);
        holder.getBinding().setVariable(BR.groupItem, group);
    }

    @Override
    public int getItemCount() {
        return filteredGroups.size();
    }

    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence charSequence) {
                String charString = charSequence.toString();

                if(charString.isEmpty()){
                    filteredGroups = groups;
                } else {
                    List<Group> fGroups = new ArrayList<>();
                    for(Group g:fGroups){
                        if(g.getName().toLowerCase().contains(charString)){
                            fGroups.add(g);
                        }
                        filteredGroups = fGroups;
                    }
                }

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

            @Override
            protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
                filteredGroups = (ArrayList<Group>) filterResults.values;
                notifyDataSetChanged();
            }
        };
    }

    public class RecyclerViewHolder extends RecyclerView.ViewHolder {

        private ViewDataBinding binding;

        public RecyclerViewHolder(View itemView) {
            super(itemView);
            binding = DataBindingUtil.bind(itemView);
        }

        public ViewDataBinding getBinding() {
            return binding;
        }
    }
}
package com.batch.mcs.finalproject.adapters;
导入android.content.Context;
导入android.databinding.DataBindingUtil;
导入android.databinding.ViewDataBinding;
导入android.support.annotation.NonNull;
导入android.support.v7.widget.RecyclerView;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.Filter;
导入android.widget.Filterable;
导入com.batch.mcs.finalproject.BR;
导入com.batch.mcs.finalproject.R;
导入com.batch.mcs.finalproject.models.Group;
导入java.util.ArrayList;
导入java.util.List;
公共类SearchFragmentRecycleServiceAdapter扩展了RecyclerView。适配器实现可筛选{
私人名单组;
私有列表过滤器组;
私人语境;
公共搜索FragmentRecycleServiceAdapter(列表组、上下文){
这个组=组;
this.filteredGroups=组;
this.context=上下文;
}
@非空
@凌驾
public RecycleServiceWholder onCreateViewHolder(@NonNull ViewGroup ViewGroup,int viewType){
LayoutInflater充气器=LayoutInflater.from(viewGroup.getContext());
视图项视图=充气机。充气(R.layout.recyclerview\u group\u information\u item,视图组,false);
返回新的RecycleServiceWholder(itemView);
}
@凌驾
BindViewHolder上的公共void(@NonNull RecycleServiceWholder holder,int位置){
Group Group=filteredGroups.get(位置);
holder.getBinding().setVariable(BR.groupItem,组);
}
@凌驾
public int getItemCount(){
返回filteredGroups.size();
}
@凌驾
公共过滤器getFilter(){
返回新筛选器(){
@凌驾
受保护过滤器结果执行过滤(CharSequence CharSequence){
String charString=charSequence.toString();
if(charString.isEmpty()){
filteredGroups=组;
}否则{
List fGroups=new ArrayList();
对于(g组:F组){
if(g.getName().toLowerCase().contains(charString)){
f组。添加(g);
}
filteredGroups=fGroups;
}
}
FilterResults FilterResults=新的FilterResults();
filterResults.values=FilteredGroup;
返回过滤器结果;
}
@凌驾
受保护的无效发布结果(CharSequence CharSequence、FilterResults FilterResults){
filteredGroups=(ArrayList)filterResults.values;
notifyDataSetChanged();
}
};
}
公共类RecyclerView.ViewHolder扩展了RecyclerView.ViewHolder{
私有视图数据绑定;
公共回收服务文件夹(查看项目视图){
超级(项目视图);
binding=DataBindingUtil.bind(itemView);
}
公共视图数据绑定getBinding(){
返回绑定;
}
}
}
    <?xml version="1.0" encoding="utf-8"?>
<layout>

    <data>
        <variable
            name="User"
            type="com.batch.mcs.finalproject.models.User"/>
    </data>

    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        style="@style/AppTheme.ActivityLayoutStyle"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/relativeLayout">

        <android.support.v7.widget.SearchView
            android:id="@+id/sv_search_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:background="@drawable/edit_text_background"
            android:layout_marginTop="@dimen/activity_vertical_margin"
            android:layout_marginBottom="@dimen/activity_vertical_margin"
            android:layout_marginStart="@dimen/activity_horizontal_margin"
            android:layout_marginEnd="@dimen/activity_horizontal_margin"
            android:maxLines="1"
            app:layout_constraintBottom_toTopOf="@+id/rv_search_layout"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv_search_layout"
            android:layout_width="match_parent"
            android:layout_height="@dimen/no_dimension"
            android:dividerHeight="@dimen/rv_search_group_margins"
            android:paddingTop="@dimen/activity_horizontal_margin"
            android:scrollbars="vertical"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/sv_search_layout" />

    </android.support.constraint.ConstraintLayout>
</layout>
searchBox.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                mAdapterSmall.getFilter().filter(s.toString());
                mAdapterBig.getFilter().filter(s.toString());
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });