2016-04-05 10 views
0

© habe ein Problem mit dem RecyclerView-Filter. Ich benutze Editiertext für Text-Change-Methode für Filtertextabfrage in Recyclerview, aber wenn ich meine Produktliste Filter ändert.Android-Liste (RecyclerView-Adapter) ändert sich, wenn sich Edittext On Text ändert

Hinweis: all das in Fragment und Fragment in Viewpager.

Mein Problem ist das: Wenn ich etwas schreibe, funktioniert es, aber gleichzeitig ändern sich die Elemente meiner Produktliste zum Ergebnis des Filters.

So in Beispiel zunächst MyList Hat 40 Artikel FilteredDataList leer Nachdem ich "a" in EditText schreiben danach FilteredDataList hat 30 Artikel aber MyList hat die gleichen 30 Produkte. Aber ich habe nichts gesetzt

zu myList

Meine Datenliste, bekomme ich es von SQLite

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

Meine Filtermethode

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; 
    } 

Mein EditText OnChange Metod

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); 
      } 
     } 
    }); 

Mein 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

könnten Sie bitte auch Ihren Adaptercode posten? – arsent

+0

Ich habe Adapterklasse hinzugefügt. – user3412648

Antwort

2

i mein Problem gelöst ist es nur über Adapter-Klasse eine Zeile :(

in Adapterklasse

statt

this.itemList = itemList; 

Verwendung dass

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

Es geht um Ihre product. Wenn Sie ein Objekt wie dieses erstellen;

Sie klonen Ihr Objekt. In der Tiefe sind sie das gleiche Objekt. Wenn Sie also das Objekt mit dem Namen a gefiltert haben, wird davon b betroffen.

Kurz gesagt, tun Sie das nicht. Anstatt ein Objekt zu klonen, sollten Sie jedes Element einzeln hinzufügen. So;

productList = new ArrayList<>(); 
    for(int i = 0 ; i <arrayFromSource.size() ; i++) 
    { 
     productList.add(arrayFromSource.get(i)); 
    } 
Verwandte Themen