2016-03-04 44 views
1

我剛剛在我的視圖中添加了SearchView,其中包含RecyclerView。它工作的很好,但每次我設置過濾器時,都會根據以前的過濾器進行過濾。另外,當我關閉搜索字段時,數據的完整列表不會再出現。在搜索期間過濾列表會修改原始數據源

這是我在適配器(我還沒有上市onBindViewHolderonCreateViewHolder,但他們在那裏):

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

你這樣做:

public void setFilter(List<Attraction> attractions) { 
    attractionsList.clear(); 
    attractionsList.addAll(attractions); 
} 

所以要添加到attractionsListattractions的參考...

如果後者修改任何這些景點在方法或化酶的,這些變化將反映在原始列表中。

您「需要」更改算法,也許使用輔助列表,這可以作爲助手幫助您獲得原始列表的不可修改副本

Collections類的報價,因爲這個原因,替代生成副本和收藏的不可修改的副本...

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Collections.html

+0

在'RecyclerView'活動甚至創造另一個'ArrayList'沒有解決不了的問題。我仍然不明白爲什麼'DataManger'中的列表正在改變。我認爲參數總是通過Java的價值傳遞的? – user3746428