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

时间:2016-04-05 01:20:34

标签: java android arraylist android-recyclerview

我有关于RecyclerView过滤器的问题。 我正在使用edittext对文本更改方法进行recyclelerview中的过滤文本查询,但是当我过滤我的产品列表时正在改变。

注意: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;
    }

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

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

    }

2 个答案:

答案 0 :(得分:2)

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

适配器类中的

而不是

this.itemList = itemList;

使用

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

答案 1 :(得分:0)

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

Class a = b();

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

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

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