RecyclerView 中自定义视图的 OnClickListener

OnClickListener for CustomView in RelyclerView

我需要为 CutomView(按钮)设置 OnClickListener,它位于 RelyclerView 中。问题是我可以点击 View,但不能点击 CustomView。有什么想法吗?

我是这样抓点击的:

我的自定义适配器:

...
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv, parent, false);

        view.setOnClickListener(TestActivity.myOnClickListener);

        return new MyViewHolder(view);
    }
...

并且在 MainActivity 中:

...
private static class MyOnClickListener implements View.OnClickListener {

        private final Context context;

        private MyOnClickListener(Context context) {
            this.context = context;
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.button_map_1: {
            }
                Toast.makeText(context, "Clicked", Toast.LENGTH_SHORT).show();
                // And nothing happens
            }
        }
        }
    }
...

从您发布的任何代码来看,您似乎没有将 onClickListener 设置为正确的视图。在您的代码中,

view.setOnClickListener(TestActivity.myOnClickListener);

您正在将 onClickListener 设置为视图,而您想将其设置为自定义视图(按钮)。所以假设在你的 rv.xml 文件中,你的自定义视图(按钮)定义为 id 为 button_map_1,那么你的代码应该是

view.findViewById(R.id.button_map_1).setOnClickListener(TestActivity.myOnClickListener);

这将在按钮 button_map_1 上设置 onClickListener

我建议您在适配器内部创建一个侦听器来捕获您的视图点击。然后 activity 可以使用 setChildClickListener 附加到适配器上。

像这样:

class MyAdapter
{
    View.OnClickListener mOnClickListener;

    public void setChildClickListener(View.OnClickListener l)
    {
        mOnClickListener = l;
    }

    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rv, parent, false);

        view.setOnClickListener(mClicks);

        return new MyViewHolder(view);
    }

    View.OnClickListener mClicks = new View.OnClickListener()
    {
        @Override
        public void onClick(View v) {
            if (null != mOnClickListener) {
                mOnClickListener.onClick(v);
            }
        }
    };
}