当Edittext On Text更改时,Android列表(RecyclerView适配器)正在更改



关于RecyclerView过滤器有问题。我在recyclerview中使用edittext on text change方法来过滤文本查询,但当我过滤我的产品列表时,它正在改变。

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

我的问题是:当我写一些东西时,它是有效的,但与此同时,我的产品列表的元素正在更改为过滤器的结果。

所以在一开始的例子中MyList有40个项目FilteredDataList为空在我在edittext中写入"a"之后,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;
    }

我的编辑文本更改日期

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

我解决了我的问题,它只是关于适配器类的一行:(

适配器类

而不是

this.itemList = itemList;

使用

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

这是关于您的productList。当你像这样创建一个对象时;

Class a = b();

您正在克隆您的对象。在深处,它们是同一个物体。因此,当您过滤名为a的对象时,b会受到此影响。

简而言之,不要这样做。您不应该克隆对象,而应该将每个项逐个从b添加到a。像这样;

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

最新更新