Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search can';t在使用filterable设置recyclerview后调用adapter.getFilter()_Search_Android Recyclerview - Fatal编程技术网

Search can';t在使用filterable设置recyclerview后调用adapter.getFilter()

Search can';t在使用filterable设置recyclerview后调用adapter.getFilter(),search,android-recyclerview,Search,Android Recyclerview,我在我的回收视图中使用了Filterable。我想做的是,从edittext中过滤recyclerview。下面是我的实际代码 public class NavDrawerAdapter_v2 extends RecyclerView.Adapter<NavDrawerAdapter_v2.ViewHolder> implements Filterable{ private static final int TYPE_ITEM = 0; private ArrayList<

我在我的回收视图中使用了Filterable。我想做的是,从edittext中过滤recyclerview。下面是我的实际代码

public class NavDrawerAdapter_v2 extends RecyclerView.Adapter<NavDrawerAdapter_v2.ViewHolder> implements Filterable{

private static final int TYPE_ITEM = 0;

private ArrayList<String> menu_list;
private ArrayList<String> filtered_menu_list;
Context mContext;

public static class ViewHolder extends RecyclerView.ViewHolder {
    int Holderid;

    TextView shopName, shopLevel;

    public ViewHolder(View itemView,int ViewType) {
        super(itemView);

        shopName = (TextView) itemView.findViewById(R.id.rowText);
        shopLevel = (TextView) itemView.findViewById(R.id.rowLevel);

        if(ViewType == TYPE_ITEM) {
            Holderid = 0;
        }
    }
}

public NavDrawerAdapter_v2(Context mContext, ArrayList<String> menu_list){
    this.menu_list = menu_list;
    this.filtered_menu_list = menu_list;
    this.mContext = mContext;
}

@Override
public NavDrawerAdapter_v2.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    if (viewType == TYPE_ITEM) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.drawer_item_row,parent,false); //Inflating the layout
        return new ViewHolder(v,viewType);
    }

    return null;
}

@Override
public void onBindViewHolder(NavDrawerAdapter_v2.ViewHolder holder, int position) {

    if (holder.Holderid == 0) {
        String getShopName = menu_list.get(position).split("-")[0];
        String getShopLevel = menu_list.get(position).split("-")[1];
        holder.shopName.setText(getShopName);
        holder.shopLevel.setText(getShopLevel);
    }
}

@Override
public int getItemCount() {
    return menu_list == null ? 0 : menu_list.size();
}

@Override
public long getItemId(int position) {
    return super.getItemId(position);
}

@Override
public int getItemViewType(int position) {

    return TYPE_ITEM;
}

public boolean okay(){
    return true;
}

@Override
public Filter getFilter() {
    return new UserFilter(this, menu_list);
}

private static class UserFilter extends Filter {

    private final NavDrawerAdapter_v2 adapter;

    private final ArrayList<String> originalList;

    private final ArrayList<String> filteredList;

    private UserFilter(NavDrawerAdapter_v2 adapter, ArrayList<String>originalList) {
        super();
        this.adapter = adapter;
        this.originalList = new ArrayList<>(originalList);
        this.filteredList = new ArrayList<>();
    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        filteredList.clear();
        final FilterResults results = new FilterResults();

        if (constraint.length() == 0) {
            filteredList.addAll(originalList);
        } else {
            final String filterPattern = constraint.toString().toLowerCase().trim();

            for (String getValue : originalList) {
                if (getValue.contains(filterPattern)) {
                    filteredList.add(getValue);
                }
            }
        }
        results.values = filteredList;
        results.count = filteredList.size();
        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        adapter.filtered_menu_list.clear();
        adapter.filtered_menu_list.addAll((ArrayList<String>) results.values);
        adapter.notifyDataSetChanged();
    }
}

}
公共类NavDrawerRadapter_v2扩展了RecyclerView。适配器实现可过滤{
私有静态最终整数类型\u项=0;
私有数组列表菜单_列表;
私有数组列表过滤菜单列表;
语境;
公共静态类ViewHolder扩展了RecyclerView.ViewHolder{
int-Holderid;
TextView shopName,shopLevel;
公共视图持有者(视图项视图、int视图类型){
超级(项目视图);
shopName=(TextView)itemView.findViewById(R.id.rowText);
shopLevel=(TextView)itemView.findViewById(R.id.rowLevel);
if(ViewType==类型\项){
Holderid=0;
}
}
}
公共导航抽屉RADAPTER_v2(上下文mContext、阵列列表菜单_列表){
this.menu\u list=菜单列表;
this.filtered\u menu\u list=菜单列表;
this.mContext=mContext;
}
@凌驾
公共NavPawerRadapter_v2.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
if(viewType==类型\项){
View v=LayoutInflater.from(parent.getContext()).flate(R.layout.drawer\u item\u row,parent,false);//充气布局
返回新的ViewHolder(v,viewType);
}
返回null;
}
@凌驾
BindViewHolder上的公共无效(导航抽屉Radapter_v2.ViewHolder,内部位置){
如果(holder.Holderid==0){
字符串getShopName=menu_list.get(position.split)(“-”[0];
字符串getShopLevel=menu_list.get(position.split)(“-”[1];
holder.shopName.setText(getShopName);
holder.shopLevel.setText(getShopLevel);
}
}
@凌驾
public int getItemCount(){
return menu_list==null?0:menu_list.size();
}
@凌驾
公共长getItemId(int位置){
返回super.getItemId(位置);
}
@凌驾
public int getItemViewType(int位置){
返回类型\ U项目;
}
公共布尔OK(){
返回true;
}
@凌驾
公共过滤器getFilter(){
返回新的UserFilter(此,菜单列表);
}
私有静态类UserFilter扩展了筛选器{
专用最终导航器v2适配器;
私人最终阵列列表原创列表;
专用最终阵列列表过滤器列表;
专用用户筛选器(NavDrawerRadapter_v2适配器,ArrayStoriginallList){
超级();
this.adapter=适配器;
this.originalList=新阵列列表(originalList);
this.filteredList=新的ArrayList();
}
@凌驾
受保护的筛选器结果性能筛选(CharSequence约束){
filteredList.clear();
最终FilterResults结果=新的FilterResults();
if(constraint.length()==0){
filteredList.addAll(原始列表);
}否则{
final String filterPattern=constraint.toString().toLowerCase().trim();
for(字符串getValue:originalList){
if(getValue.contains(filterPattern)){
filteredList.add(getValue);
}
}
}
results.values=filteredList;
results.count=filteredList.size();
返回结果;
}
@凌驾
受保护的void publishResults(CharSequence约束、FilterResults结果){
adapter.filtered_menu_list.clear();
adapter.filtered\u menu\u list.addAll((ArrayList)results.values);
adapter.notifyDataSetChanged();
}
}
}

但是,在我的片段中。我无法调用adapter.getFilter()。这里有什么问题?

如果您希望EditText用于searchView,则需要为EditText添加更改侦听器,如链接中所述:

当文本更改时,您应该调用

adapter.getFilter().filter(newText);
或者,您应该尝试使用recyclerView在操作栏中实现searchview。为此,请在RecyclerView适配器中实现getFilter()方法。可以使用链接中实现的getFilter()方法

menu.xml:

<item android:id="@+id/menuSearch"
  android:title="search"
  android:icon = "@android:drawable/ic_menu_search"
  app:actionViewClass = "android.support.v7.widget.SearchView"
  app:showAsAction = "always|collapseActionView"></item>

当用户更改文本时,通过监视日志检查是否调用了onQueryTextChange()方法。如果未调用它,请尝试将上述代码放入onPrepareOptions功能表()方法中,而不是onCreateOptions功能表()方法中。

按照您的示例,我很确定您将对象分配给了RecyclerView.Adapter变量,而不是活动中的NavDrawerRadapter\u v2变量

RecyclerView.Adapter=新的NavDrawerRadapter_v2(菜单列表)

而不是

NavPaureRadapter_v2适配器=新的NavPaureRadapter_v2(菜单列表)

NavDrawerRadapter_v2从RecyclerView.Adapter扩展而来,但同时实现了Filterable

如果将对象分配给RecyclerView.Adapter变量,则仍然可以调用getItemCount()、onBindViewHolder()和onCreateViewHolder()(因为它们是来自RecyclerView.Adapter的抽象方法)


糟糕的是,您将无法调用getFilter(),因为它属于可过滤接口。

您是如何解决的?
MenuItem item = menu.findItem(R.id.menuSearch);
//SearchView searchView = (SearchView) item.getActionView(); 
SearchView searchView =  (SearchView) MenuItemCompat.getActionView(item); 

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {

//Called when the query text is changed by the user.
@Override
public boolean onQueryTextChange(String newText) {
    Log.d("soda in MainActivity","onQueryTextChange method is called.");
    mutfagimFragment.adapter.getFilter().filter(newText);
    return false;
}
});