如何在RecyclerView中添加/删除子项目,以及有关Order Restaurant App的建议?

伊戈尔(Igor Mytyuk)

实际上,我正在尝试制作一个可以在餐馆中接受订单的应用程序。

大概您知道,当服务员点菜时,他可以从菜单中添加任何项目来记录(例如笔记本),甚至可以为添加的项目添加变体。

例如,我在应用程序中有一个披萨菜单,当我按菜单中的某些项目时,将其添加到笔记本中(菜单和笔记本为2 RecyclerView),然后将其添加到笔记本中,我可以通过添加子项目来“修改”它们还是最好的孩子。

或更好的是,我的笔记本上有3个不同的比萨,只需单击其中的一个,我就可以添加从另一个回收站视图中选择的变体“ PIZZA”和变体“ WITH PEPERONI”或“ WITHOUT PEPERONI”或“ WITH MOZZARELLA” 。

现在,我认为我的应用程序运行良好,就像我已经拥有了我所需要的一样,正如您可以在此GIF上看到的那样,我正在将recyclerView“食品”添加到“ NOTEBOOK” recyclerView中的某些项目,然后按VARIANTI i能够将子项添加到上次添加的食品中。

在此处输入图片说明 在此处输入图片说明

但是问题来了,当我必须删除添加到食物中的单个变量时,我会对如何单击单个变量并能够删除单个变量提出一些建议。

这是我的适配器代码:

   public class AdapterPTERM extends RecyclerView.Adapter<AdapterPTERM.ExampleViewHolder> {

    private List<ItemPTERM> mExampleList;
    private final LayoutInflater mInflater;
    private OnItemClickListener mListener;
    private List<Variant> variants;
    private ManageAddRemoveCallbacks mManageAddRemoveCallbacks ;


    private View.OnClickListener varientClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(v.getTag()!= null){
                int position = (int) v.getTag();
            }
        }
    };

    public interface  OnItemClickListener{
        void onItemClick(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener){
        mListener = listener;
    }

    @NonNull
    @Override
    public ExampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_pterm,parent,false);
        return new ExampleViewHolder(v,mListener);
    }

    AdapterPTERM(Context context, List<ItemPTERM> exampleList){
        mExampleList = exampleList;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public void onBindViewHolder(@NonNull final ExampleViewHolder holder, final int position) {
        final ItemPTERM item = mExampleList.get(position);

        holder.desc.setText(item.getBtnName());
        holder.qta.setText(String.valueOf(item.getQuant()));

        holder.variantsContainer.removeAllViews();


        // ADDING CHILD HERE

        variants = item.getVariants();
        if (variants != null && variants.size() > 0){
            for(Variant v : variants){
                View vView = mInflater.inflate(R.layout.variant_layout,holder.variantsContainer,false);
                TextView nameTV = vView.findViewById(R.id.variant_name);
                nameTV.setText(v.getName());
                vView.setTag(position);
                vView.setOnClickListener(varientClickListener);
                holder.variantsContainer.addView(vView);

            }
        }

        tvAddItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                void onAddItem(true);
            }
        });

        tvRemoveItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                void onBtnClickRemoveItem(true);
            }
        });

        // NOT IMPORTANT (CHANGING FIELDS COLOR)
        if(position % 2 == 0 ){
            holder.itemView.setBackgroundColor(Color.parseColor("#C0C0C0"));

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

    }

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

    public class ExampleViewHolder extends RecyclerView.ViewHolder {

        public TextView desc;
        public TextView qta;
        private LinearLayout variantsContainer;

        ExampleViewHolder(View itemView, final OnItemClickListener listener) {
            super(itemView);


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

            try {
                mManageAddRemoveCallbacks = ((ManageAddRemoveCallbacks) this);
            } catch (ClassCastException e) {
                throw new ClassCastException("ManageAddRemoveCallbacks must implement ManageAddRemoveCallbacksCallback.");
            }

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(listener != null){
                        int position = getAdapterPosition();
                        if(position != RecyclerView.NO_POSITION){
                            listener.onItemClick(position);
                        }
                    }
                }
            });

        }
    }



    public void removeItem(int position) {
        mExampleList.remove(position);
        notifyItemRemoved(position);
    }

    public interface ManageAddRemoveCallbacks {
        void onAddItem(boolean isAdded);

        void onBtnClickRemoveItem(boolean isRemoved);
    }

}
Umair

您可以在各自的接口上实现接口。click listeners();首先转到您的适配器并声明一个接口,如下所示:

 private ManageAddRemoveCallbacks mManageAddRemoveCallbacks ;

public interface ManageAddRemoveCallbacks {
    void onAddItem(boolean isAdded);

    void onBtnClickRemoveItem(boolean isRemoved);
}

现在在您的viewHolder中初始化您的界面:

 try {
        this.mManageAddRemoveCallbacks = ((ManageAddRemoveCallbacks) currentFragment);
    } catch (ClassCastException e) {
        throw new ClassCastException("ManageAddRemoveCallbacks must implement ManageAddRemoveCallbacksCallback.");
    }

现在,在您的bind方法中,将点击侦听器添加视图中,将值分配给您的interfaces

  tvAddItem.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            void onAddItem(ture or false depending on your requirements);
        }
    });


tvRemoveItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                void onBtnClickRemoveItem(ture or false depending on your requirements);
            }
        });

现在,执行此操作之后,您需要在活动/片段中实现以下接口:

Your Activity extends AppCompatActivity implements YourAdapter.InterfaceName

以便您可以使用这些。这样,您将在活动中获取值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有关安全性的App API设计建议

有关此项目的Google App引擎(如果可能),并提供低成本建议

AttributeError: 'Restaurant' 对象没有属性 'flavours' - 为什么?

无法在 python 中创建 restaurant.db 文件

Rake任务中未初始化的常量Faker :: Restaurant

如何将每个项目的POS餐厅注释添加到POS Restaurant收据中?

有关如何使用UIScrollView的建议

有关如何构建程序的建议

建议如何将Spring Batch App迁移到AWS

在App Maker中获取建议框的输入数据

在MVC中,为什么我的控制器需要接收“新的{id = restaurant.Id}”而不是“ restaurant.Id”?不仅是简单的int吗?

如何在Intellij中获取有关编译错误的建议

有关如何在git中处理未完成的用户故事的分支的建议

有关如何在Docker中管理python模块的建议?

我需要有关如何在Django中实现复选框的建议

需要有关如何在PostgresSQL中处理大表的建议

寻找有关如何在我的Android应用中存储和访问游戏信息的建议

如何在执行复杂的操作时不让“ APP”卡住[关于App性能的建议]?

有关为C#Windows Form和Android App创建在线数据库的建议/提示

有关命名GCP项目的建议

有关多项目Webpack配置的建议

有关如何在Parse DB中有效存储图像的建议

有关如何改进当前模糊搜索实现的建议

有关如何创建此按钮形状的建议

PySpark有关如何组织RDD的建议

有关如何存储和处理多维数据的建议?

征求有关如何处理申请的建议

有关如何加快此python函数速度的建议?

有关如何运行非常大的宏的建议