1

我正在开发一种搜索功能,如果我在android的searchview中输入搜索关键字,我应该会得到与我的搜索词匹配的学生列表。我写了一个代码,但得到一个错误。 plaese让我知道,如果我正确地使用适配器。我的onCreateOptionsMenu功能在SearchView中过滤器无法在Android中工作

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 

    getMenuInflater().inflate(R.menu.options_menu, menu); 
    SearchManager searchManager =(SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchView searchView =(SearchView) menu.findItem(R.id.search).getActionView(); 
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 



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

     @Override 
     public boolean onQueryTextChange(String newText) { 

      StudentAdapter.getFilter().filter(newText); 
      return true; 

     } 
    }); 

    return true; 
} 

我studentAdapter类:

public class StudentAdapter extends 
    RecyclerView.Adapter<StudentAdapter.MyViewHolder> implements 
    Filterable { 

public List<StudentModel> new_list; 
private List<StudentModel> original_list; 

@Override 
public Filter getFilter() { 
    return new Filter() { 
     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
             FilterResults results) { 
      new_list = (List<StudentModel>) results.values; 
      StudentAdapter.this.notifyDataSetChanged(); 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults initial_results = new FilterResults(); 

      if (constraint == null || constraint.length() == 0) { 
       initial_results.values = original_list; 
       initial_results.count = original_list.size(); 
      } else { 

       // We perform filtering operation 
       List<StudentModel> filteredList = new ArrayList<StudentModel>(); 

       // breaking string into words algorithm 
       String str = constraint.toString(); 
       ArrayList<String> arrayOfWords = new ArrayList<String>(); 
       int i = 0; 
       for (String word : str.split(" ")) { 
        arrayOfWords.add(word); 
        i++; 
       } 

       for (StudentModel model : original_list) { 
        boolean matched = false; 

        for (String element : arrayOfWords) { 


         if ((null != model.getName() && model 
           .getName().toUpperCase() 
           .contains(element.toString().toUpperCase())) 


           || ((null != model.getClass() && model 
           .getClass() 
           .toUpperCase() 
           .contains(
             element.toString() 
               .toUpperCase())))) { 
          matched = true; 
         } else { 
          matched = false; 
          break; 
         } 

        } 

       } 

       initial_results.values = filteredList; 
       initial_results.count = filteredList.size(); 

      } 

      return initial_results; 
     } 
    }; 
    // return null; 
} 

public class MyViewHolder extends RecyclerView.ViewHolder { 
    public TextView name, class; 

    public MyViewHolder(View view) { 
     super(view); 
     name = (TextView) view.findViewById(R.id.name); 
     class = (TextView) view.findViewById(R.id.class); 


    } 
} 

public StudentAdapter(List<StudentModel> original_list) { 

    this.original_list = original_list; 
} 

public List<StudentModel> getStudentlist() { 
    return original_list; 
} 

@Override 
public StudentAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, 
                 int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()).inflate(
      R.layout.original_list_row, parent, false); 

    return new StudentAdapter.MyViewHolder(itemView); 
} 

@Override 
public void onBindViewHolder(StudentAdapter.MyViewHolder holder, 
          int position) { 
    StudentModel original_list_vo = original_list.get(position); 

    holder.name.setText(original_list_vo.getName()); 
    holder.class.setText(original_list_vo.getClass()); 


} 

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

} 

任何帮助将不胜感激,谢谢提前。

回答

0

在onCreate中声明您的搜索视图像这样。

sv= (android.widget.SearchView) findViewById(R.id.searchViewid);  

sv.setIconifiedByDefault(false); 
    sv.setOnQueryTextListener(this); 
    sv.setSubmitButtonEnabled(true); 
    sv.setQueryHint("Search Here"); 

现在骑上这些方法。

@Override 
public boolean onQueryTextSubmit(String query) { 
    return false; 
} 

@Override 
public boolean onQueryTextChange(String newText) 
{ 
    android.widget.Filter filter = YourAdapter.getFilter(); 
    if (TextUtils.isEmpty(newText)) { 
     YourListView.clearTextFilter(); 
     YourAdapter.getFilter().filter(""); 
    } else { 
     YourListView.setFilterText(newText); 
    } 
    filter.filter(newText); 
    return true; 
} 

试试这个,并告诉输出是什么。