java - 当文本上的 Edittext 更改时,Android 列表(RecyclerView 适配器)正在更改

标签 java android arraylist android-recyclerview

我对 RecyclerView 过滤器有疑问。 我正在使用 edittext 的文本更改方法来在 recyclerview 中过滤文本查询,但是当我过滤我的产品列表时,它正在发生变化。

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

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

所以首先在示例中 我的列表有 40 项 过滤数据列表为空 当我在 edittext 中写入“a”后,FilteredDataList 有 30 个项目,但 MyList 有相同的 30 个项目。但我还没有在我的列表中设置任何内容

我的数据列表,我从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);
            }
        }
    });

我的适配器类

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

关于java - 当文本上的 Edittext 更改时,Android 列表(RecyclerView 适配器)正在更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36415560/

相关文章:

java - 如何在android studio中为另一个数组列表中的每个值创建一个数组列表

java - 用 Linkedhashmap VALUE 替换 ArrayList 项

java - 在没有反射 API 的情况下通过存储在字符串中的名称调用方法?

java - 找不到我的元素( Selenium 初学者)

java - eclipse中的构建过程

android,无需遍历所有位置即可找到最近的位置

android - 将 http URL 插入 Android MediaStore 播放列表

java - 如何将单个 ArrayList<CustomObj> 元素传递给另一个 Activity

java - 在 ImageView 之上显示动画

java - 我可以创建一个从中继承此信息的基类吗?