1

검색 기능을 개발 중입니다. 검색 기능을 사용하여 검색 창에 android의 검색 키워드를 입력하면 검색 단어와 일치하는 학생 목록을 가져와야합니다. 코드를 작성했지만 오류가 발생했습니다. 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

검색보기를 켜기로 선언하십시오. 이렇게 작성하십시오.

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; 
} 

출력 결과를 알려주십시오.

관련 문제