Android 正在尝试创建将使用searchview筛选的recyclerview
我一直在尝试创建一个将使用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
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) {
}
});