android - 如何让我的子项目可点击?

标签 android android-recyclerview parent-child

实际上,我正在尝试开发一家允许接受订单的餐厅。

但实际上我在为我的食物添加变体时遇到了一些问题。我会更好地解释,我有一个 recyclerView“FOOD”,我从中将项目添加到另一个 recyclerView“NOTEBOOK”,就像服务员注意到有人点了什么。

另外,在我的应用程序中,我可以向添加到 NOTEBOOK 的 FOOD 添加一些变体,换句话说,我已经将 PIZZA 添加到我的 NOTEBOOK,并且通过变体,我可以向 PIZZA 添加一个名为“BIG”或“WITH”的子项PEPERONI”或两者兼而有之。

为了添加一个 child ,我在我的适配器中做了以下操作

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

    private List<ItemPTERM> mExampleList;
    private final LayoutInflater mInflater;
    private OnItemClickListener mListener;

    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

        final List<Variant> 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);

            }





        }


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


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


        }
    }


    private View.OnClickListener varientClickListener=new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.i("VIEW:", "CLICKED");

        }
    };

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

}

现在我可以单击我添加的每个子项目,甚至可以添加一个 onSwipe 方法,因为我可以从食物中删除特定变体。

这是我的 recyclerView 与 recyclerView 和 subview 的截图。

enter image description here

现在如何在我的 Activity 中使用 onClick?

最佳答案

创建一个全局 OnClickListener 并为所有变体 View 设置监听器。

 public class AdapterPTERM extends RecyclerView.Adapter<AdapterPTERM.ExampleViewHolder> {
    private List<ItemPTERM> mExampleList;
    private final LayoutInflater mInflater;
    private OnItemClickListener mListener;
    View.OnClickListener varientClickListener=new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.d("Click","Called");
        }
    };
    ........
}

为每个添加的 View 设置监听器并将位置设置为标签并在单击 View 时将其取回。

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

现在您可以将监听器修改为:

View.OnClickListener varientClickListener=new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(v.getTag()!=null){
                int position= (int) v.getTag();
                // Use position to process data 
            }

        }
    };

可以设置多个标签。请参阅 setTag 方法的变体。

关于android - 如何让我的子项目可点击?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51085632/

相关文章:

android - 在 kotlin 中分组并添加列表

java - 将数据传递到 RecyclerView 时出现空引用问题

java - RecyclerView 滑动而不删除项目

css - 从子 css 覆盖父级的最大宽度

android - onBackPressed() 到父 Activity

android - react-native-fbsdk 无法编译 'com.android.support:appcompat-v7:25.0.0'

java - Android - 如何在 Volley 请求后重新加载数据

android - 在 Android MVVM 架构中显示来自 ViewModel 的对话框

android - RecyclerView with nested RecyclerView - 使嵌套的 RecyclerView 作为一个整体 View 可点击

maven - 是否可以使用 Maven 3.1 同时构建两个子模块?