【问题标题】:Unable to delete on swipe while searching for an item in SearchView [Inventory App]在 SearchView [Inventory App] 中搜索项目时无法在滑动时删除
【发布时间】:2018-09-17 14:56:06
【问题描述】:

实际上我正在尝试制作一个用于库存的应用程序。

所以在扫描了一些条形码后,我将它们添加到ArrayList,然后在recyclerView 中,我的recyclerView 有一个过滤方法和一个searchView,所以用户应该能够搜索抛出条形码和必须能够在滑动时删除搜索到的项目。

当我打开位于dialogAlert 中的recyclerView 并且如果我删除项目一切正常,但是当我搜索项目并删除它然后我关闭searchView 时,该项目仍保留在@ 987654328@.

我将在此处提供我的适配器代码,以及我在 Activity 中构建和删除项目的代码。

这是来自 Activity 的代码:

@SuppressLint("SetTextI18n")
@TargetApi(Build.VERSION_CODES.KITKAT)
public void alertDeleteSingleItem(final int position){
    final AlertDialog.Builder mBuilder = new AlertDialog.Builder(InventarioActivity.this);

    @SuppressLint("InflateParams") View mView = getLayoutInflater().inflate(R.layout.alert_confirm_delete, null);

    final Button yes = mView.findViewById(R.id.btnSI);
    final Button no = mView.findViewById(R.id.btnNO);
    final TextView text = mView.findViewById(R.id.textView);

    text.setText("ELIMINARE " + itemAdapter.getList().get(position).getCodiceArticolo() + " ?");

    mBuilder.setView(mView);
    final AlertDialog dialog = mBuilder.create();
    Objects.requireNonNull(dialog.getWindow()).setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    dialog.show();


    yes.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            itemAdapter.removeItem(position);
            dialog.dismiss();
        }
    });

    no.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            dialog.dismiss();
        }
    });

}

public void buildVariableRecycler(View view) {
    recyclerView = view.findViewById(R.id.rectclerItems);
    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this);
    itemAdapter = new ItemAdapter(itemModel);
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setAdapter(itemAdapter);


    new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
            int position = viewHolder.getAdapterPosition();


            if (direction == ItemTouchHelper.RIGHT) {
                alertDeleteSingleItem(position);
            }

            if (direction == ItemTouchHelper.LEFT) {
                alertDeleteSingleItem(position);
            }

        }
    }).attachToRecyclerView(recyclerView);

}

这是我的适配器:

    public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ExampleViewHolder>  implements Filterable {


    private ArrayList<ItemModel> variantiConstructors;
    private List<ItemModel> mFilteredList;


    @NonNull
    @Override
    public ItemAdapter.ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recycler,parent,false);
        RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        v.setLayoutParams(lp);
        return new ItemAdapter.ExampleViewHolder(v);
    }

    ItemAdapter(ArrayList<ItemModel> exampleList){
        variantiConstructors = exampleList;
        mFilteredList = variantiConstructors;
    }

    @Override
    public void onBindViewHolder(@NonNull final ItemAdapter.ExampleViewHolder holder, @SuppressLint("RecyclerView") final int position) {
        ItemModel item = variantiConstructors.get(position);

        holder.desc.setText(item.getCodiceArticolo());
        holder.qta.setText(item.getQta());

        holder.qta.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                variantiConstructors.get(position).setQta(holder.qta.getText().toString());
            }

            @Override
            public void afterTextChanged(Editable editable) {
            }
        });


        if(position % 2 == 0 ){
            holder.itemView.setBackgroundColor(Color.parseColor("#5C5C5C"));

        }else if(position % 2 == 1){
            holder.itemView.setBackgroundColor(Color.parseColor("#9E9E9E"));
        }
    }


    @Override
    public Filter getFilter() {
        return new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                final FilterResults oReturn = new FilterResults();
                final ArrayList<ItemModel> results = new ArrayList<>();
                if (mFilteredList == null)
                    mFilteredList = new ArrayList<>(variantiConstructors);
                if (constraint != null && constraint.length() > 0) {
                    if (mFilteredList != null && mFilteredList.size() > 0) {
                        for (final ItemModel cd : mFilteredList) {
                            if (cd.getCodiceArticolo().toLowerCase()
                                    .contains(constraint.toString().toLowerCase()))
                                results.add(cd);
                        }
                    }
                    oReturn.values = results;
                    oReturn.count = results.size(); //newly Aded by ZA
                } else {
                    oReturn.values = mFilteredList;
                    oReturn.count = mFilteredList.size(); //newly added by ZA
                }
                return oReturn;
            }

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(final CharSequence constraint,
                                          FilterResults results) {
                variantiConstructors = new ArrayList<>((ArrayList<ItemModel>) results.values);
                notifyDataSetChanged();
            }
        };
    }

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

    public class ExampleViewHolder extends RecyclerView.ViewHolder {

        public TextView desc;
        public EditText qta;

        ExampleViewHolder(View itemView) {
            super(itemView);

            desc = itemView.findViewById(R.id.Desc);
            qta = itemView.findViewById(R.id.Qta);
        }
    }


    public ArrayList<ItemModel> getList(){
        return variantiConstructors;
    }


    public void removeItem(int position){

        variantiConstructors.remove(position);
        notifyDataSetChanged();
    }

}

在做了一些测试之后,当我搜索一个项目时,我在滑动时发现它的位置为 0,所以这就是问题所在,但是我怎样才能在项目的正确位置上滑动呢?

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    检查getFilter() 方法中的代码。您可以很容易地看出这是因为过滤器将项目列表保留在临时列表中。并且在过滤期间主列表被关闭。

    当您从过滤列表中删除项目时,您从临时列表中删除,而不是从主列表中删除。知道这一点后,您也许也可以通过过滤列表以某种方式实现删除,但我不会印象深刻,因为 getFilter()SearchView 不适用于这种特定情况。

    原因可能是 Delete 更多是与后端相关的操作,而不是当前 UI 及以上的操作,因为您的操作是库存应用程序。

    因此,通过更多控制来实现您真正想要的最佳方法是不要使用getFilter()SearchView。只需实现您自己的自定义搜索视图并使用相同的列表进行过滤并将 Delete 与您的后端连接。我已经为类似的库存应用程序这样做了,我发现它更方便。

    【讨论】:

      【解决方案2】:

      您正在获得已删除的结果,因为它仍在用于过滤器的临时数组列表中。 更新您的适配器方法,

      public void removeItem(int position){
      
              variantiConstructors.remove(position);
              mFilteredList.remove(position);
              notifyDataSetChanged();
          }
      

      【讨论】:

        【解决方案3】:

        首先将这些行放在删除项目的位置:

        yourAdapter.remove(yourArrayList.get([INDEX]));
        yourAdapter.notifyDataSetChanged();
        

        那么,你可以再次调用这条线:

        setListAdapter(yourAdapter);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-15
          • 1970-01-01
          • 2020-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多