接口回调基础理解

接口回调听起来好像很厉害的样子,但其实只要能够搞清楚代码的执行过程,多看几遍,并且认真思考,再加上勤奋的练习,熟练掌握简单的接口回调并不是难题,接下来,我会用一个简单的例子,来带大家一起分析代码的执行过程,以及这样写的好处,以及这样写的思路。

我们知道recyclerView是没有自带点击事件的,所以这里我们就拿给recyclerView添加点击事件为例。

ok 我们做好了一个简单的recycerView,但是此时点击他的条目是无效的,接下来我们为他添加自己定义的条目点击事件。

在适配器中加入:

 //自定义公开接口,定义抽象方法
    public interface onItemClickListener{
        void onItemClick(int position,View itemView);
    }
    //创建接口类型变量(接受传值并设置事件)
    private onItemClickListener mOnItemClickListener;
    //暴露设置接口的方法
    public void setOnItemClickListener(onItemClickListener mOnItemClickListener){
        this.mOnItemClickListener = mOnItemClickListener;
    }

在适配器的onBindViewHolder方法中开始监听事件:

 @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
        final MyViewHolder viewHolder = (MyViewHolder) holder;
        viewHolder.textView.setText(datas.get(position));
        if (position % 2 == 0){
            viewHolder.textView.setTextColor(Color.BLUE);
        }else {
            viewHolder.textView.setTextColor(Color.RED);
        }
        if (mOnItemClickListener != null){
            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickListener.onItemClick(pos,holder.itemView);
                }
            });
        }
    }

最后一步就是在MainActivity中,实现onItemClickListener接口,设置监听,并实现抽象方法:


public class MainActivity extends AppCompatActivity implements MyAdapter.onItemClickListener


adapter.setOnItemClickListener(this);


  @Override
    public void onItemClick(int position, View itemView) {
        Toast.makeText(MainActivity.this, "条目位置 :" + ( position + 1 ), Toast.LENGTH_SHORT).show();
    }

OK,点击事件添加成功


很简单,很快,但是这个自己添加的点击事件,其中代码的执行过程大家清楚么?

按照代码的执行顺序,我们添加的代码第一句执行的就是:

adapter.setOnItemClickListener(this);
这是调用了适配器设置监听的方法,this代表当前类,我们这里指的就是MainActivity,而这个方法定义的参数要求是一个我们自己定义的接口,所以我们要通过
MainActivity去实现OnItemClickListener接口,那么此时我们的MainActivity就也可以称作是OnItemClickListener类型。
将MainActivity传入后,就是将我们传入的值赋值给了自己定义的接口类型变量
//暴露设置接口的方法
    public void setOnItemClickListener(onItemClickListener mOnItemClickListener){
        this.mOnItemClickListener = mOnItemClickListener;
    }
然后我们再来看一看这个自己定义的变量去做了什么:
 
if (mOnItemClickListener != null){
            viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickListener.onItemClick(pos,holder.itemView);
                }
            });
        }

这是添加在onBindViewHolder中的,在调用了setOnItemClickListener方法后,mOnItemClickListener就不为空,然后当viewholder的条目点击之后,我们的mOnItemClickListener就调用了自己的onItemClick方法。

开始思考:我们这里的mOnItemClickListener不为空,那么他的值是哪里来的呢?是谁呢? 没有错,就是我们的MainActivity,那么这里调用了onItemClick方法,实际上调用的就是MainActivity中实现的抽象方法onItemClick

 @Override
    public void onItemClick(int position, View itemView) {
        Toast.makeText(MainActivity.this, "条目位置 :" + ( position + 1 ), Toast.LENGTH_SHORT).show();
    }

至此,我们得以解惑,只要在MainActivity中,实现一个接口,就实现了RecyclerView的点击事件,也了解了这个代码的执行过程,不过有人可能会疑惑,点击事件我直接写在适配器中不好吗,这样MainActivity中的代码不是会更少,更简洁吗?


好,根据质疑,我将代码做了如上修改,确实,点击事件依然好用,但是接口回调就没有作用吗?那还要他干嘛。好了,我要提出需求了。

如果我们的需求是点击了一条目之后,修改MainActivity中一个控件(例如Button)的背景颜色,想一想,此时怎么操作?

可能还真有头铁的愣头青会说:可以在MainActivity中通过适配器的构造方法,把控件(例如Button)对象传到Adapter里面,很好,很有思想。但是我这里首先不说你违背了通俗的编程习惯(我没怎么见过把一个控件对象传来传去的),如果我要有100个控件要改变呢?

显然 100个夸张了一点,但是基本的设计模式,我们还是要遵循的,所以接口回调的好处,大家体会到了吗?


Demo下载


  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值