我刚刚在包含SearchView
的视图中添加了RecyclerView
。它工作得很好,但每次我设置过滤器时,它都会针对前一个过滤器进行过滤。此外,当我关闭搜索字段时,不会再出现完整的数据列表。
这是我在适配器中的内容(我没有列出onBindViewHolder
或onCreateViewHolder
,但它们在那里):
public class AttractionRowAdapter extends RecyclerView.Adapter<AttractionRowHolder> {
private List<Attraction> attractionsList;
private Context context;
public AttractionRowAdapter(Context context, List<Attraction> attractionsArrayList) {
this.attractionsList = attractionsArrayList;
this.context = context;
}
public void setFilter(List<Attraction> attractions) {
attractionsList.clear();
attractionsList.addAll(attractions);
notifyDataSetChanged();
}
public void clearAdaptor() {
attractionsList.clear();
notifyDataSetChanged();
}
这是我在活动中使用RecyclerView
:
@Override
public boolean onQueryTextChange(String newText) {
final List<Attraction> filteredModelList = filter(DataManager.attractionArrayList, newText);
attractionsAdapter.setFilter(filteredModelList);
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.action_search, menu);
final MenuItem item = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) MenuItemCompat.getActionView(item);
searchView.setOnQueryTextListener(this);
MenuItemCompat.setOnActionExpandListener(item, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
attractionsAdapter.setFilter(DataManager.attractionArrayList);
return true;
}
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
这就是DataManager
类中的内容:
static ArrayList<Attraction> attractionArrayList = new ArrayList<Attraction>();
我还有一个函数,我在attractionArrayList
从数据库加载后添加了所有的吸引力。
问题似乎与方法setFilter
有关,因为我发现它正在修改DataManager.attractionsArrayList
。
任何人都知道它为什么会这样做,以及我如何保持完整列表的完整性,同时过滤该列表的副本(就像我试图做的那样)?
答案 0 :(得分:0)
你这样做:
public void setFilter(List<Attraction> attractions) {
attractionsList.clear();
attractionsList.addAll(attractions);
}
因此您要向attractionsList
添加attractions
...
如果您后者修改该方法或clase中的任何景点,这些更改也会反映在原始列表中。
您“需要”更改算法并使用辅助列表,这可以帮助您获取原始列表的不可修改的副本。
由于这个原因,集合类提供了生成副本和不可修改的集合副本的替代方案......
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html