2017-07-07 76 views
0

我目前正試圖實現一個SearchView,但顯示的搜索結果只會改變第一個搜索,我忽略了進入SearchView的所有其他內容。如何搜索RecyclerView中顯示的對象列表?

這是我在我的MainActivity.java搜索代碼:

testList = Arrays.asList(new TestItem("aw"), new TestItem("aa"), new TestItem("w")); 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.test_menu, menu); 

    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); 
    searchView.setOnQueryTextListener(this); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onQueryTextChange(String newText) { 
    List<TestItem> result = new ArrayList<>(); 
    for(TestItem t: testList) { 
     if(t.getName().contains(newText) { 
      result.add(t); 
     } 
    } 
    adapter.changeList(result); 
    return true; 
} 

adapter.changeList:

public void changeList(List<TestItem> newList) { 
    this.list = new ArrayList<>(newList); 
} 

onQueryTextChange得到每個文本更改後調用,但搜索結果只顯示一次。當輸入aEnter時,RecyclerView顯示awaa(是否必須按Enter鍵以啓動onQueryTextChange?),但是當我輸入aa時,顯示的項目保持不變。

回答

1

我認爲你的實現是不正確的。您無需按搜索結果的輸入。對於實現,您可以保留數組列表的完整副本。然後在查詢文本發生更改時製作另一個臨時列表表單。所以當你正在過濾時,你正在搜索實際列表而不是過濾列表。

1.pass搜索關鍵字的列表適配器

public boolean onQueryTextChange(String newText) { 

    adapter.getFilter().filter(newText); 
    return true; 
} 

2.在適配器實現過濾性和覆蓋方法

@Override 
public Filter getFilter() { 
    if (frameFilter == null) { 
     frameFilter = new FrameFilter(); 
    } 

    return frameFilter; 
} 

3.過濾類可以是這樣的: 'categoryMain' 是我的完整列表和'categoryTemp'是我的臨時列表

private class FrameFilter extends Filter { 

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 

     FilterResults filterResults = new FilterResults(); 
     if (constraint != null && constraint.length() > 0) { 
      ArrayList<Category> tempList = new ArrayList<>(); 

      // search content in friend list 
      Log.i("key",constraint.toString()); 
      for (Category category : categoriesMain) { 
       if (category.getCategory_name().toLowerCase().contains(constraint.toString().toLowerCase())) { 
        tempList.add(category); 
       } 
      } 
      filterResults.count = tempList.size(); 
      filterResults.values = tempList; 
     } else { 

      filterResults.count = categoriesMain.size(); 
      filterResults.values = categoriesMain.clone(); 
     } 
     return filterResults; 
    } 

    /** 
    * Notify about filtered list to ui 
    * 
    * @param constraint text 
    * @param results filtered result 
    */ 
    @SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 

     categoriesTemp = (ArrayList<Category>) results.values; 
     notifyDataSetChanged(); 
    } 
} 
+0

非常感謝您的幫助。如果我用'filterResults.values = categoriesMain'替換'filterResults.values = categoriesMain.clone();',你的解決方案對我有用。 – sininen