没有获取 RecyclerView 项目布局中单击的子项目的 ID

not getting id of a clicked child item inside RecyclerView item layout

我在 ConstraintLayout 中实现了 RecyclerView。我在布局中有一个子图像元素。但是当我点击子图片时,它总是 returns ConstraintLayout,而不是点击的图片。

你能告诉我为什么会这样吗,有什么解决办法吗?

我单独将侦听器绑定到图像,它可以工作但无法获取 RecyclerItem 对象。我需要 RecyclerItem 对象才能继续。 我通过 Adapter 中的 onBindViewholder 方法绑定元素来实现它。下面是代码


customAdapter = new GridViewAdapter(recyclerItems, 1, this.getContext().getPackageName(),
                new GridViewAdapter.OnItemClickListener(){
                    @Override
                    public void onItemClick(RecyclerItem item) {
                        CommonUtil.addFragment("REP", Constants.CONTAINER_HOME,
                                    new ModifyFragment(), getActivity(), null);

                        
                    }
                }, R.layout.rec_view_item_stock, Constants.V_SPAN_LIST_8);
        RecyclerView recyclerView = view.findViewById(R.id.stockListRecView);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setLayoutManager(new GridLayoutManager(this.getContext(), 1));
        recyclerView.setAdapter(customAdapter);


//Adapter
public class GridViewAdapter extends RecyclerView.Adapter<GridViewAdapter.ViewHolder>{

    private List<RecyclerItem> dataItems;
    private int hSpan = 1;
    private String packageName;
    private final OnItemClickListener listener;
    private int inflator;
    private int vSpan;

    public interface OnItemClickListener {
        void onItemClick(RecyclerItem item);
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        private final ConstraintLayout constraintLayout;
        private final TextView textView;
        private final ImageView imageView;
        private Object obj;

        public ViewHolder(View view) {
            super(view);
            constraintLayout = (ConstraintLayout) view.findViewById(R.id.rec_content_layout);
            textView = constraintLayout.findViewById(R.id.recTextView);
            imageView = constraintLayout.findViewById(R.id.recImage);
        }

        public void bind(final RecyclerItem item, final OnItemClickListener listener) {
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listener.onItemClick(item);
                }
            });
        }

        public TextView getTextView() {
            return textView;
        }

        public ImageView getImageView() {
            return imageView;
        }

        public Object getObj() {
            return obj;
        }

        public void setObj(Object obj) {
            this.obj = obj;
        }
    }

    public GridViewAdapter(List<RecyclerItem> items, int spanCount, String packageName, OnItemClickListener listener,
                           int inflator, int vSpan) {
        dataItems = items;
        this.hSpan = spanCount;
        this.packageName = packageName;
        this.listener = listener;
        this.inflator = inflator;
        this.vSpan = vSpan;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int gridType) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(inflator, viewGroup, false);
        ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
        layoutParams.width = (viewGroup.getResources().getDisplayMetrics().widthPixels / hSpan) - 24;
        if(Constants.V_SPAN_GRID == vSpan) {
            layoutParams.height = layoutParams.width;
        } else {
            layoutParams.height = (viewGroup.getResources().getDisplayMetrics().widthPixels / vSpan);
        }
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, final int position) {
        viewHolder.getTextView().setText(dataItems.get(position).getText());
        int imgId = viewHolder.getImageView().getResources().getIdentifier(
                dataItems.get(position).getImageName(), "drawable", packageName);
        viewHolder.getImageView().setImageResource(imgId);
        viewHolder.setObj(dataItems.get(position));
        viewHolder.bind(dataItems.get(position), listener);
    }


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

//item layout
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/rec_content_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:layout_marginTop="8dp"
    android:layout_marginLeft="4dp"
    android:padding="8dp"
    android:background="@drawable/border_top_bottom" >

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/viewstock_gline_1_v"
        android:layout_width="1dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.6"/>

    <ImageView
        android:id="@+id/recImage"
        android:background="@color/colorPrimaryDark"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp" />
    <TextView
        android:id="@+id/recTextView"
        app:layout_constraintLeft_toRightOf="@+id/recImage"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp" />

    <ImageView
        android:id="@+id/editstock_image"
        android:src="@drawable/ic_edit_stock"
        android:background="@color/colorPrimaryDark"
        app:layout_constraintRight_toLeftOf="@+id/deletestock_image"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp" />
    <ImageView
        android:id="@+id/deletestock_image"
        android:src="@drawable/ic_delete_stock"
        android:background="@color/colorPrimaryDark"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp" />


</androidx.constraintlayout.widget.ConstraintLayout>```

试试这个!

public void bind(final RecyclerItem item, final OnItemClickListener listener, TextView itemTextView) {
        itemTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onItemClick(item);
            }
        });
    }

从视图持有者或来回传递每个项目文本视图实例 onBindViewHolder 本身实现 onclick 侦听器