2015-06-17 56 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); 
}