[英]Filter RecyclerView Android Not working
我已經實現了recycler view
並在Internet上進行了搜索,如何實現數據filter
,當我運行該應用程序並開始搜索時遇到了問題! 沒有任何顯示,沒有錯誤,該方法不起作用,我將發布我的代碼,如果有人有想法請告訴我
RceyclerView適配器
public class TodoRecyclerAdapter extends RecyclerView.Adapter<TodoRecyclerAdapter.ViewHolder> {
static List<ToDo> todoResults;
static Context context;
static List<Data> resultslocal;
private ArrayList<ToDo> arrayList = null, stringArrayList;
static List<Data> localData;
ArrayList<Data> arraylist;
private List<String> mDefaultCheeses;
private List<String> mFilteredCheeses;
public TodoRecyclerAdapter(TodoList todoList, List<Data> dbList) {
this.localData = dbList;
arraylist = new ArrayList<Data>();
arraylist.addAll(localData);
}
@Override
public TodoRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.todo_items, null);
ViewHolder viewHolder = new ViewHolder(itemLayoutView);
return viewHolder;
}
@Override
public void onBindViewHolder(final TodoRecyclerAdapter.ViewHolder holder, final int position) {
holder.todoTitle.setText(localData.get(position).getTODO_TITLE().toString());
String priority = localData.get(position).getPriority().toString();
if (priority.equals("Low")) {
holder.todoImage.setImageResource(R.drawable.low);
} else if (priority.equals("Normal")) {
holder.todoImage.setImageResource(R.drawable.normal);
} else if (priority.equals("High")) {
holder.todoImage.setImageResource(R.drawable.high);
}
}
@Override
public int getItemCount() {
return localData.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView todoTitle;
public ImageView todoImage;
public ViewHolder(View itemLayoutView) {
super(itemLayoutView);
todoTitle = (TextView) itemLayoutView.findViewById(R.id.todo_title);
todoImage = (ImageView) itemLayoutView.findViewById(R.id.imageView2);
}
}
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
localData.clear();
if (charText.length() == 0) {
localData.addAll(arraylist);
} else {
for (Data data : arraylist) {
if (charText.length() != 0 && data.getTODO_TITLE().toLowerCase(Locale.getDefault()).contains(charText)) {
localData.add(data);
} else if (charText.length() != 0 && data.getPriority().toLowerCase(Locale.getDefault()).contains(charText)) {
localData.add(data);
}
}
}
notifyDataSetChanged();
}
}
並且在Activity中調用filter方法時
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_search, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
}
});
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return true;
}
@Override
public boolean onQueryTextChange(final String searchQuery) {
recyclerAdapter.filter(searchQuery.toString().trim());
todoRecyclerView.invalidate();
return true;
}
});
MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
});
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_search) {
return true;
}
return super.onOptionsItemSelected(item);
}}
編輯使用MatchableRVArrayAdapter
在我添加MatchableRVArrayAdapter.class之后,請執行以下操作
public class TodoAdapter extends MatchableRVArrayAdapter<ToDo, TodoAdapter.VH> {
public TodoAdapter(Context context) {
super(context, android.R.layout.simple_list_item_1);
}
@Override
protected VH onCreateHolder(View view) {
return new VH(view);
}
@Override
protected void onBindHolder(ToDo item, VH holder, int position) {
holder.note.setText(item.getTODO_TITLE());
}
@Override
protected boolean matches(ToDo value, String lowerCasePrefix) {
return value.getTODO_TITLE().toLowerCase().contains(lowerCasePrefix);
}
class VH extends RecyclerView.ViewHolder {
private final TextView note;
public VH(View itemView) {
super(itemView);
note = (TextView) itemView.findViewById(android.R.id.text1);
}
}
}和主要活動
MatchableRVArrayAdapter matchableRVArrayAdapter;
TodoAdapter todoAdapter1;
public List<Data> dbList;
Data data = new Data();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_todo_list);
getLocalData();
todoRecyclerView = (RecyclerView) findViewById(R.id.todoRecyclerView);
todoRecyclerView.setHasFixedSize(true);
results = new ArrayList<ToDo>();
DatabaseHelpher helpher = new DatabaseHelpher(this);
dbList = new ArrayList<Data>();
todoAdapter1= new TodoAdapter(this);
dbList.addAll(helpher.getDataFromDB());
matchableRVArrayAdapter.add(dbList);
並進入菜單
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return true;
}
@Override
public boolean onQueryTextChange(final String searchQuery) {
todoAdapter1.getFilter().filter(searchQuery);
return false;}});
我知道這個錯誤
Caused by: java.lang.NullPointerException
at com.example.todo.loginretroft.Activites.TodoList.onCreate(TodoList.java:67)
TodoList.java:67=matchableRVArrayAdapter.add(dbList);
實施到SearchView.OnQueryTextListener
初始化SearchView ...
SearchView.setOnQueryTextListener(this);
SearchView.setQueryHint("Search ...");
SearchView.setIconifiedByDefault(true);
創建一個自定義過濾器列表
private List<Movie> filter(List<Movie> datas, String newText) {
newText = newText.toLowerCase();
final List<Movie> filteredModelList = new ArrayList<>();
for (Movie data : datas) {
final String text = data.getTitle().toLowerCase();
if (text.contains(newText)) {
filteredModelList.add(data);
}
}
return filteredModelList;
}
將此添加到您的適配器類
public void setItems(List<Movie> datas) {
moviesList = new ArrayList<>(datas);
}
將這些代碼寫在實現的子代碼中
@Override
public boolean onQueryTextChange(String newText) {
final List<Movie> filteredModelList = filter(movieList, newText);
mAdapter.setItems(filteredModelList);
mAdapter.notifyDataSetChanged();
recyclerView.scrollToPosition(0);
return false;
}
@Override
public boolean onQueryTextSubmit(String arg0) {
return false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.