我剛剛在我的視圖中添加了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
。
任何人都知道它爲什麼這樣做,以及如何保持完整列表完好無損,同時過濾該列表的副本(就像我試圖做的那樣)?
在'RecyclerView'活動甚至創造另一個'ArrayList'沒有解決不了的問題。我仍然不明白爲什麼'DataManger'中的列表正在改變。我認爲參數總是通過Java的價值傳遞的? – user3746428