Android中点击事件回调接口踩坑心得

有时候写代码的时候有这样的功能要求,如在ListView或recyclerView中的Item中的控件(如Button,TextView)上添加回调接口事件。其实难点就在添加回调接口事件上,怎么写接口,接口回调在哪里,这才是关键。下面是个例子:

接口的写法:一下是两接口

//1.定义接口
    public interface OnTelePhoneClickListener {
        void onTelephoneClick(GroupMemberBean bean);
    }

    //2.声明接口
    public OnTelePhoneClickListener onTelePhoneClickListener;

    //设置接口监听的方法
    public void setOnTelePhoneClickListener(OnTelePhoneClickListener listener){
        this.onTelePhoneClickListener = listener;
    }



    //1.定义接口
    public interface OnLineClickListener {
        void onLineCLickListener(GroupMemberBean bean);
    }
    //2.声明接口
    private OnLineClickListener onLineClickListener;
    //暴露接口方法
    public void setOnLineClickListener(OnLineClickListener listener){
        this.onLineClickListener = listener;
    }

接口设置的监听位置,这个很重要,如果监听位置不当,得不到想要的效果,下面是代码:

//获取Item的布局和设置监听的位置
    @Override
    public View getView(final int position, View view, ViewGroup parent) {
        ViewHolder viewHolder = null;
        final GroupMemberBean mContent = list.get(position);
        if (view == null){
            viewHolder = new ViewHolder();
//            view = LayoutInflater.from(context).inflate(R.layout.company_item,null);
            view = LayoutInflater.from(context).inflate(R.layout.company_item,parent,false);
            viewHolder.tv_company = view.findViewById(R.id.tv_company);
            viewHolder.tv_letter = view.findViewById(R.id.tv_letter);
            viewHolder.btn_phone = view.findViewById(R.id.btn_phone);
            viewHolder.btn_online = view.findViewById(R.id.btn_online);

            //特别注意:给每一个item添加点击监听  不能写在这里,请看下面:
            //监听不能写在这里面,这里的代码只有view第一次创建的时候才会走,之后就不再走此代码,
            // 所以点击Item的时候就会拿不到对应的Item的数据
            //因此将点击回调监听写在view创建过程之外
            /*viewHolder.btn_phone.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    GroupMemberBean bean = list.get(position);
                    onTelePhoneClickListener.onTelephoneClick(bean);
                    Log.d("TEST", "onItemClick: 点击电话 " + bean.getPhoneNumber() + bean.getName());
                }
            });

            viewHolder.btn_online.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    GroupMemberBean bean = list.get(position);
                    onTelePhoneClickListener.onTelephoneClick(bean);
                    Log.d("TEST", "onItemClick: 点击电话 " + bean.getPhoneNumber() + bean.getName());
                }
            });*/
            view.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) view.getTag();
        }
//正确的监听位置应该写在这里,即等item布局拿到以后再设置点击事件并回传数据
        viewHolder.btn_phone.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onTelePhoneClickListener.onTelephoneClick(list.get(position));
            }
        });

        viewHolder.btn_online.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onLineClickListener.onLineCLickListener(list.get(position));
            }
        });

        viewHolder.tv_company.setText(this.list.get(position).getName());
        return view;
    }

设置完接口,然后再MainActivity中回调接口,下面是回调方法:

sortListView.setAdapter(adapter);//设置布局

adapter.setOnTelePhoneClickListener(new SortItemAdapter.OnTelePhoneClickListener() {
            @Override
            public void onTelephoneClick(GroupMemberBean bean) {
//获取到item传来的数据
                Log.d("LISTENER", "onTelephoneClick: LISTENER" + bean.getName() + bean.getPhoneNumber());
            }
        });

        adapter.setOnLineClickListener(new SortItemAdapter.OnLineClickListener() {
            @Override
            public void onLineCLickListener(GroupMemberBean bean) {
//获取到item传来的数据
                Log.d("ONLINELISTENER", "onLineCLickListener: " + bean.getName() + bean.getPhoneNumber());
            }
        });

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值