2016-04-05 43 views
0

©對RecyclerView過濾器有問題。 ©我正在使用edittext文本更改方法在recyclerview中過濾文本查詢,但是當我過濾我的產品列表正在改變。當Edittext On Text更改時,Android列表(RecyclerView適配器)正在更改

注意:所有在片段和片段中的viewpager。

我的問題是:當我寫東西時它正在工作,但同時我的產品列表的元素正在改變爲過濾器的結果。

所以例如在第一 MYLIST中有40個項目 FilteredDataList是空 後,我寫的「A」的EditText後FilteredDataList是有30個項目,但MYLIST具有相同的30個項目。但我還沒有設定什麼MYLIST

我的數據列表,我從SQLite的

productList = new ArrayList<>(); 
     productList = handler.getAllProduct(); 
得到它

我的篩選方法

private List<Product> filter(List<Product> models, String query) { 
     query = query.toLowerCase(); 

     List<Product> filteredModelList = new ArrayList<>(); 

     filteredModelList.clear(); 
     for (Product model : models) { 
      final String text = model.get_ProductName().toLowerCase(); 
      if (text.contains(query)) { 
       filteredModelList.add(model); 
      } 
     } 
     return filteredModelList; 
    } 

我EDITTEXT的OnChange梅託德

searchEdt.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void afterTextChanged(Editable s) { 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, 
            int before, int count) { 
      if (s.length() != 0) { 
       List<Product> filteredModelList = filter(productList, s.toString()); 

       rcAdapter.animateTo(filteredModelList); 
       pager_recycler_view.scrollToPosition(0); 
      } else { 

       rcAdapter.animateTo(productList); 
       pager_recycler_view.scrollToPosition(0); 
      } 
     } 
    }); 

我AdapterClass

public class ProductRecyclerViewAdapter extends RecyclerView.Adapter<ProductRecyclerViewHolder> { 

     private List<Product> itemList; 
     private Context context; 

     public ProductRecyclerViewAdapter(Context context, List<Product> itemList) { 
      this.itemList = itemList; 
      this.context = context; 
     } 

     @Override 
     public ProductRecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

      View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.product_card_single_item, null); 
      ProductRecyclerViewHolder rcv = new ProductRecyclerViewHolder(layoutView); 
      return rcv; 
     } 

     @Override 
     public void onBindViewHolder(ProductRecyclerViewHolder holder, int position) { 


      holder.productName.setText(itemList.get(position).get_ProductName()); 
      holder.productWatCode.setText("%" +itemList.get(position).get_ProductWatCode()); 
      holder.productPOR.setText("%" +itemList.get(position).get_ProductPOR()); 
      holder.productRSP.setText("£" +itemList.get(position).get_ProductRSP()); 
      holder.productDescription.setText(itemList.get(position).get_ProductDescription()); 
      holder.productSKU.setText(itemList.get(position).get_ProductSKU()); 
      holder.productPrice.setText("£" + itemList.get(position).get_ProductPrice()); 
    //  holder.productCountCart.setText(""); 


      Picasso.with(context) 
        .load("http://firmabayi.com/images/ilanK/" +itemList.get(position).get_ProductPhoto()) 
        .placeholder(R.drawable.add_icon) 
        .error(R.drawable.minus_icon) 
        .into(holder.productPhoto); 

      // holder.countryPhoto.setImageResource(itemList.get(position).get_ProductName()); 

     } 

     @Override 
     public int getItemCount() { 
      return this.itemList.size(); 
     } 

     public void animateTo(List<Product> itemList) { 
      applyAndAnimateRemovals(itemList); 
      applyAndAnimateAdditions(itemList); 
      applyAndAnimateMovedItems(itemList); 
     } 


     private void applyAndAnimateRemovals(List<Product> newModels) { 
      for (int i = itemList.size() - 1; i >= 0; i--) { 
       final Product model = itemList.get(i); 
       if (!newModels.contains(model)) { 
        removeItem(i); 
       } 
      } 
     } 

     private void applyAndAnimateAdditions(List<Product> newModels) { 
      for (int i = 0, count = newModels.size(); i < count; i++) { 
       final Product model = newModels.get(i); 
       if (!itemList.contains(model)) { 
        addItem(i, model); 
       } 
      } 
     } 

     private void applyAndAnimateMovedItems(List<Product> newModels) { 
      for (int toPosition = newModels.size() - 1; toPosition >= 0; toPosition--) { 
       final Product model = newModels.get(toPosition); 
       final int fromPosition = itemList.indexOf(model); 
       if (fromPosition >= 0 && fromPosition != toPosition) { 
        moveItem(fromPosition, toPosition); 
       } 
      } 
     } 

     public Product removeItem(int position) { 
      final Product model = itemList.remove(position); 
      notifyItemRemoved(position); 
      return model; 
     } 

     public void addItem(int position, Product model) { 
      itemList.add(position, model); 
      notifyItemInserted(position); 
     } 

     public void moveItem(int fromPosition, int toPosition) { 
      final Product model = itemList.remove(fromPosition); 
      itemList.add(toPosition, model); 
      notifyItemMoved(fromPosition, toPosition); 
     } 

    } 
+0

你能否也請發佈你的適配器代碼? – arsent

+0

我添加了適配器類。 – user3412648

回答

2

我解決我的問題是隻有約適配器類一行:(

在適配器類

,而不是

this.itemList = itemList; 

使用該

this.itemList = new ArrayList<>(itemList); 
0

這是關於你productList的。 當你像這樣創建一個對象時;

Class a = b(); 

你在克隆你的對象。在深處,它們是同一個對象。 所以,當你過濾了名爲a的對象時,b正在受此影響。

總之,不要這樣做。而不是克隆對象,你應該添加每個項目從一個由一個。 像這樣;

productList = new ArrayList<>(); 
    for(int i = 0 ; i <arrayFromSource.size() ; i++) 
    { 
     productList.add(arrayFromSource.get(i)); 
    } 
相關問題