使onClickListener在RecyclerViewAdapter的“活动”中可访问

时间:2018-07-04 08:50:50

标签: android android-recyclerview

实际上,在我的RecyclerView中,我可以通过以编程方式添加view和TextView来创建Child项。

我什至在同一RecyclerView中为父项添加了onClickListener,并且为子视图添加了onClick方法,但现在的主要问题是如何在Activity中使用Child onClick?

这是我的适配器代码

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

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



    // ONCLICK FOR THE CHILD ITEMS

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


        // CREATING CHILD ITEM

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



            // onClick method for Parent Item

            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 void removeVariant(int position,int positionbtn){
        mExampleList.get(positionbtn).getVariants().remove(position);
        notifyDataSetChanged();
    }


}

这是我从Activity中创建我的RecyclerView的代码,在这里我使用onClick作为父对象,使AlertDialog出现,但是我可以通过单击onChild而不是parent来使AlertDialog出现。 / p>

public void buildTopRecyclerView() {

    mRecyclerViewTOP = findViewById(R.id.listView);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this);
    exampleAdapter = new AdapterPTERM(this,dummyDataItems);
    mRecyclerViewTOP.setLayoutManager(mLayoutManager);
    mRecyclerViewTOP.setAdapter(exampleAdapter);
    mRecyclerViewTOP.setHasFixedSize(true);

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

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

            if (direction == ItemTouchHelper.RIGHT) {
                customAllertDelete(position);
                exampleAdapter.notifyItemChanged(position);
            }

            if (direction == ItemTouchHelper.LEFT) {
                customAllertQuantity(position);
                exampleAdapter.notifyItemChanged(position);
            }

        }
    }).attachToRecyclerView(mRecyclerViewTOP);


    exampleAdapter.setOnItemClickListener(new AdapterPTERM.OnItemClickListener() {
        @Override
        public void onItemClick(int position) {
            if (dummyDataItems.get(position).getVariants() != null) {
                    customAlertVar(position);

                }else {
                    //
                }
        }
    });

}

1 个答案:

答案 0 :(得分:0)

已解决

我只需要删除

networks:
  name: host

在我的适配器中,它正在处理另一次单击,并且阻塞了AlertDialog,甚至删除了

// ONCLICK FOR THE CHILD ITEMS

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

        }
    }
};