【发布时间】:2017-01-31 23:31:21
【问题描述】:
我有一个 RecyclerView 列表,它显示了 CardViews 的垂直列表。 AppBar 有一个 action_search MenuItem,它在单击时处理 SearchView 方法。 SearchView 运行允许搜索 CardView 数据的过滤器方法。
我设置了一个 filterList 来保存从搜索结果中过滤的 CardView。 filter() 方法在执行搜索查询之前清除 filterList。问题是 filterList.clear() 破坏了现有 RecyclerView CardViews 的 View 并且 UI 恢复为空白 RecyclerView 布局。
如果我退出应用程序然后重新启动应用程序,RecyclerView 会正确加载 CardViews,当我单击搜索 MenuItem 时,我就可以正确搜索;也就是说,视图会动态且正确地更新,以仅显示与搜索文本查询匹配的 CardView。我在这里错过了什么?
MainActivity.java
public class MainActivity extends AppCompatActivity implements
RecyclerItemClickListener {
private MyRecylerAdapter adapter;
...
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.cardview_menu, menu);
MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView item);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
adapter.filter(query);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
adapter.filter(newText);
return true;
}
});
return;
}
Adapter.java
public class MyRecylerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<ListItem> listItems, filterList;
private Context mContext;
public MyRecylerAdapter(Context context, List<ListItem> listItems) {
this.listItems = listItems;
this.mContext = context;
this.filterList = new ArrayList<>();
// Copy the original list to the filter list to be used for setting row
// values when returning search data items.
this.filterList.addAll(this.listItems);
}
public void clear() {
while (getItemCount() > 0) {
remove(getItem(0));
}
}
public void filter(final String text) {
new Thread(new Runnable() {
@Override
public void run() {
filterList.clear();
if(TextUtils.isEmpty(text)) {
filterList.addAll(listItems);
} else {
for (ListItem item : listItems) {
if (item.getTodo().toLowerCase().contains(text.toLowerCase())) {
filterList.add(item);
}
}
}
// Set on UI Thread
((Activity) mContext).runOnUiThread(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
});
}
}).start();
}
}
【问题讨论】:
标签: android android-recyclerview android-adapter