Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使我的子项可单击?_Android_Android Recyclerview_Parent Child - Fatal编程技术网

Android 如何使我的子项可单击?

Android 如何使我的子项可单击?,android,android-recyclerview,parent-child,Android,Android Recyclerview,Parent Child,事实上,我正在尝试开发一家允许点菜的餐厅 但事实上,我在食物中添加变体时遇到了一些问题。我会更好地解释,我有一个recyclerView“食物”,从中我将物品添加到另一个recyclerView“笔记本”,就像服务员记下了某人点的东西一样 此外,在我的应用程序中,我可以将一些变体添加到添加到笔记本的食物中,换句话说,我已经将比萨饼添加到我的笔记本中,通过变体,我可以将一个名为“大”或“带PEPERONI”的孩子添加到比萨饼中,或者两者兼而有之 为了添加子级,我在适配器中执行了以下操作 publi

事实上,我正在尝试开发一家允许点菜的餐厅

但事实上,我在食物中添加变体时遇到了一些问题。我会更好地解释,我有一个recyclerView“食物”,从中我将物品添加到另一个recyclerView“笔记本”,就像服务员记下了某人点的东西一样

此外,在我的应用程序中,我可以将一些变体添加到添加到笔记本的食物中,换句话说,我已经将比萨饼添加到我的笔记本中,通过变体,我可以将一个名为“大”或“带PEPERONI”的孩子添加到比萨饼中,或者两者兼而有之

为了添加子级,我在适配器中执行了以下操作

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

}
公共类AdapterTerm扩展了RecyclerView.Adapter


现在,如何在活动中使用onClick?

创建一个全局的
OnClickListener
,并将listener设置为所有变量视图

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

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

只需在每个添加的视图上设置
OnClickListener
。您可以将数据的标记设置为added
View
@ADM您可以举个例子,您对标记的含义是什么?我刚刚开始使用androidBecause,因为实际上视图可能很多,所以我必须为每个视图创建OnClickListener?事实上,我甚至不知道可以有多少变体,使用expandable recyclerView可以更轻松地实现您正在尝试的功能。这是您在gradle dependency compile'com.bignerdranch.android:expandablerecyclerview:x.x.x中添加的一行代码,这是一个如何工作的示例项目:@JohnKarry您需要了解适配器的实际工作方式:)。只有一个clickListener,它可以处理您的所有项目,因为您将像ADM所说的那样给予它位置。你现在的做法是,最好使用expandable recyclerview或listview来解决这个问题。我如何创建一个全局OnClickListener?我实际上制作了一个名为varientClick的公共界面,并在其中放置了你答案的第一个方法,对吗?是的
setTag()
我之所以使用,是因为我们通常需要确定单击的视图的位置。你可以通过标签和其他一些你想要的数据来获取它。除此之外,您还可以尝试使用Expandable
ListView
RecyclerView
。而您答案中的第三种方法必须放在活动中?我刚刚更新了我的问题,说明了我试图对您的代码执行的操作。您能检查一下我做错了什么吗?
 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 
            }

        }
    };