如何设置 RecyclerView Item内子控件点击事件

前言

起初学习 Android 的时候,为了兼容低版本的安卓(不是有兼容包吗?摔!),在学习列表的时候,选择了 ListView 而跳过了 RecyclerView。最近项目需要增加新功能模块,于是动起了在该功能中用 RecyclerView 替代 ListView 的念头。

关于 RecyclerView 的总结,有时间我一定补上(咕咕)...... 这里先记录一下使用中遇到的问题及我的一些心得体会。

RecyclerView点击事件

这里主要介绍的是 郭霖 《第一行代码 第二版》中使用的方法,及参考网上的一些改进方法。

创建ItemView时添加点击事件

即在 RecyclerView Adapter类 中:onCreateViewHolder()中可以取得 Item Item内子控件,那么我们可以在此处设置监听。

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.ate_recyclerview_item, parent, false);
        final ViewHolder holder = new ViewHolder(view,mOnItemClickListener);
        holder.ItemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = holder.getAdapterPosition();
                ATE_RecyclerviewItem_Data ate = mATEList.get(position);
                Toast.makeText(view.getContext(), "你点击了View"+ ate.getName(), Toast.LENGTH_SHORT).show();
            }
        });
        holder.ateEdit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //...
            }
        });
        return holder;
    }

这种方法实现起来很简单,但是我们的逻辑需要写在 Adapter 中,耦合严重

改进:通过接口实现点击事件

RecyclerView 的 Adapter类

    private OnItemClickListener mOnItemClickListener;

    public interface OnItemClickListener {
        void onButtonClicked(View view, int position,String input_str);
    }
    
   
    public void setOnItemClickListener(OnItemClickListener clickListener) {
        this.mOnItemClickListener = clickListener;
    }

    //...
    

    static class ViewHolder extends RecyclerView.ViewHolder{
        View ItemView;
        TextView ateName;
        EditText ateEdit;
        Button ateButton;

        public ViewHolder(View view, final OnItemClickListener onClickListener) {
            super(view);
            ItemView = view;
            ateName = view.findViewById(R.id.ate_name);
            ateEdit = view.findViewById(R.id.ate_edit);
            ateButton = view.findViewById(R.id.ate_button);

            ateButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if (onClickListener != null) {
                        int position = getAdapterPosition();
                        //确保position值有效
                        if (position != RecyclerView.NO_POSITION) {
                            onClickListener.onButtonClicked(view, position,,ateEdit.getText().toString());
                        }
                    }
                }
            });
        }
    }

    //...

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.ate_recyclerview_item, parent, false);
        final ViewHolder holder = new ViewHolder(view,mOnItemClickListener);

        return holder;
    }

这里我们在 ViewHolder 中设置了子控件 Button 的点击事件,而点击事件的处理方法是接口 OnItemClickListener()onButtonClicked()

这一接口必须在外部实现,于是我们对外暴露了 setOnItemClickListener()方法。

接下来需要解决的问题是,ViewHolder是静态内部类,我们如何在 ViewHolder 中取得 OnItemClickListener()呢?

这里使用的方法是在 onCreateViewHolder()中 创建 ViewHolder 时进行传参。

外部使用时,仅需要

        adapter.setOnItemClickListener(new ATEAdapter.OnItemClickListener() {
            @Override
            public void onButtonClicked(View view, int position, String input_str) {
                Toast.makeText(getActivity(),position+":"+ input_str,Toast.LENGTH_SHORT).show();
            }
        });

效果(这里仅截取了部分)

 

 

 

  • 14
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 在Qt中,可以使用以下方法来获取一个Widget内的所有件: 1. 使用QObject::findChildren()方法。该方法可以通过指定件的对象名和类名来获取Widget内的所有件。以下是一个示例代码: ```cpp QList<QLineEdit*> lineEdits = widget->findChildren<QLineEdit*>(); foreach (QLineEdit* lineEdit, lineEdits) { // 对件进行操作 } ``` 以上代码中,通过findChildren<QLineEdit*>()方法获取Widget内所有QLineEdit类型的件,并将它们存储在一个QList中。然后可以使用foreach循环来对每个件进行操作。 2. 使用QWidget::findChild()方法。该方法可以通过指定件的对象名和类名来获取Widget内的一个件。以下是一个示例代码: ```cpp QLineEdit* lineEdit = widget->findChild<QLineEdit*>("lineEditObjectName"); if (lineEdit) { // 对件进行操作 } ``` 以上代码中,通过findChild<QLineEdit*>()方法获取Widget内名为"lineEditObjectName"的QLineEdit类型件。然后可以对该件进行操作。 此外,在Qt的设计模式中,常使用QWidget::children()方法来获取Widget内的所有件。以下是一个示例代码: ```cpp QList<QLineEdit*> lineEdits; foreach (QObject* child, widget->children()) { QLineEdit* lineEdit = qobject_cast<QLineEdit*>(child); if (lineEdit) { lineEdits.append(lineEdit); } } ``` 以上代码中,通过对QWidget::children()方法返回的QObject对象列表进行类型转换,将所有QLineEdit类型的件存储在一个QList中。 通过以上方法,你可以方便地获取Widget内的所有件,并对它们进行操作。 ### 回答2: 在Qt中,可以使用`QObject::findChildren()`方法来获取widget内的所有件。该方法可以根据指定的对象名称(object name)和对象类型(object type)来查找件。 使用该方法需要先获得要获取件的widget对象的指针。 然后,可以使用如下代码来获取widget内所有件的列表: ```cpp // 获取widget对象 QWidget* parentWidget = ... // 定义件列表 QList<QWidget*> childWidgets; // 使用findChildren()方法获取所有件 childWidgets = parentWidget->findChildren<QWidget*>(); ``` 上述代码中,`parentWidget`是要获取件的父级widget对象指针,而`childWidgets`是一个QList容器,用于存储找到的件对象。 可以根据实际需要,通过设置对象名称或者对象类型来对件进行过滤。例如,如果需要只获取具有特定对象名称的件,可以使用如下代码: ```cpp childWidgets = parentWidget->findChildren<QWidget*>("objectName"); ``` 上述代码中,`"objectName"`是指定的对象名称,只有具有该对象名称的件才会被获取。 总结起来,要获取widget内的所有件,可以使用`QObject::findChildren()`方法,并根据实际需要设置对象名称或对象类型来过滤件。获取到的件可以通过遍历容器来对其进行进一步的操作或处理。 ### 回答3: 在Qt中,可以通过widget的childItems()函数来获取widget内的所有窗体件。childItems()函数返回的是一个QList<QGraphicsItem*>类型的列表,其中存储了widget内的所有件。可以遍历这个列表来获取每个件的相关信息。 使用childItems()函数需要包含<QtWidgets/QGraphicsItem>头文件。下面是一个示例代码: ```cpp #include <QtWidgets/QGraphicsItem> // 获取widget内窗体所有件的函数 void getAllChildWidgets(QWidget* widget) { QList<QGraphicsItem*> childItems = widget->childItems(); for (QGraphicsItem* item : childItems) { // 可以通过item来进行件的操作,比如获取件的类型、属性等 // 下面展示获取件的类型 QString typeName = item->typeName(); qDebug() << "件类型:" << typeName; } } // 调用示例 QWidget* mainWidget = new QWidget; // ...添加件... getAllChildWidgets(mainWidget); ``` 这样就可以通过遍历childItems()返回的列表,获取到widget内的所有窗体件,可以根据需要进行相关操作,比如获取件的类型、属性等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值