在搜索期间过滤列表会修改原始数据源

时间:2016-03-04 19:26:25

标签: java android arraylist android-recyclerview searchview

我刚刚在包含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

任何人都知道它为什么会这样做,以及我如何保持完整列表的完整性,同时过滤该列表的副本(就像我试图做的那样)?

1 个答案:

答案 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