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();
}
}
, 사전에 감사합니다.