2015-06-17 55 views
-1

我有一個ArrayList的對象。每當用戶輸入一個searchView時,我都會使用這個方法,這就是filterBy的功能。變量byName是一個布爾值,用於確定我們是通過名稱還是代碼進行搜索。我的錯誤是:通過ArrayList搜索時的錯誤

  1. 我使用關鍵字「苜蓿」測試它,但它返回每次我輸入一個字母(我做數據庫本身同樣的事情檢查)額外的項目。
  2. 如果我在searchView中有文本時單擊開關(更改byName布爾值),它將繼續移除項目,直到沒有任何內容。
  3. 在searchView中刪除文本將繼續刪除文本(這一個讓我感到困惑,因爲它只是在這個方法中設置了刪除項目的列表)。

有什麼想法是什麼導致了這個?

private void displayProducts() { 
    final Querier querier = new Querier(this); 
    ProductListAdapter productListAdapter; 

    if (filterBy.equals("")) { 
     products = querier.getProductsListing(); 

     productListAdapter = new ProductListAdapter(this, products.getProductsList(), byName); 
    } else { 
     Products ps = products; 

     for (int i = 0; i < products.getProductsList().size(); i++) { 
      final Product prod = ps.getProductsList().get(i); 

      if (byName) { 
       if (!prod.getProductName().toLowerCase().contains(filterBy)) 
        ps.getProductsList().remove(prod); 

      } else if (!prod.getOrderCode().toLowerCase().contains(filterBy)) 
       ps.getProductsList().remove(prod); 
     } 

     Log.v("removed some junk, now there are", String.valueOf(ps.getProductsList().size())); 

     productListAdapter = new ProductListAdapter(this, ps.getProductsList(), byName); 
    } 

    productsLinearLayout.setAdapter(productListAdapter); 
} 
+4

迭代和從一個'集合'同時從一個基於循環的索引中刪除從不是一個好主意 – Blackbelt

回答

0

如果這對其他人有幫助,下面是我如何修復它。

private void displayProducts() { 
    final Querier querier = new Querier(this); 
    ProductListAdapter productListAdapter; 
    products = querier.getProductsListing(); 

    if (filterBy.equals("")) 
     productListAdapter = new ProductListAdapter(this, products.getProductsList(), byName); 
    else { 
     ArrayList<Product> ps = new ArrayList<>(products.getProductsList()); 

     for (Product p : products.getProductsList()) { 
      if (byName) { 
       if (!p.getProductName().toLowerCase().contains(filterBy)) 
        ps.remove(p); 

      } else { 
       if (!p.getOrderCode().toLowerCase().contains(filterBy)) 
        ps.remove(p); 
      } 
     } 

     Log.v("removed some junk, now there are", String.valueOf(ps.size())); 

     productListAdapter = new ProductListAdapter(this, ps, byName); 
    } 

    productsLinearLayout.setAdapter(productListAdapter); 
}