详解android 接口回调

原创 2016年06月01日 10:53:34

详解android 接口回调


看图and看代码 给一个详细的接口回调方法调用 顺序 , 有一个直观 的理解。

正常情况下 MainFragment 里面的 list 列表的 点击事件 应该在 它里面实现,
但是为了达到一些目的与要求,如重复利用,减少代码量 。需要一个类似list列表的模版,所以哪里需要用到MainFragment 就在哪里实现 list 点击事件 具体实现方法。

本文章中 RecyclerDeleteActivity 这个 类中 用到了MainFragment ,所以就在RecyclerDeleteActivity 中实现具体的点击方法,如何实现呢?就需要MainFragment 提供一个 接口 ,也就是说在 MainFragment 中 提供一个框,或者说一个平台,也就是接口,等到点击list条目的时候,首先走到MainFragment 中的 onListItemClick 里面, 但是 执行的 是 RecyclerDeleteActivity中的 onItemClick 也就是在MainFragment 中这句代码

             mListItemClickListener.**onItemClick**(position);

mListItemClickListener 就是 从 RecyclerDeleteActivity中 获取的 实现接口的对象 。

在上面的MainFragment中 该句代码mListItemClickListener.onItemClick(position); 同时是把点击的position 传递给 RecyclerDeleteActivity
完成了 一个 接口回调过程。


先看 结果
1. 点击 按钮 进入 RecyclerDeleteActivity
这里写图片描述

控制台 log 打印

这里写图片描述

2 . 点击按钮 执行 item 列表 点击事件

这里写图片描述

控制台 log 打印

这里写图片描述


**
看代码  log 的 打印位置 以及 执行 顺序。。。

接口类 - MainFragment  并 继承了 ListFragment 
------------------

** 

public class MainFragment extends ListFragment {
    private onListItemClickListener mListItemClickListener;

    //定义一个回调接口,用来将点击事件传回他的宿主Activity去做,Fragment中不做具体的逻辑操作
    public interface onListItemClickListener {

        void **onItemClick**(int position);
    }

    public MainFragment() {

    }

    @Override
    public void onAttach(Context context) {

        super.onAttach(context);
        //他的宿主Activity将实现onListItemClickListener接口
        //使用getActivity()获得的宿主Activity,将他强转成onListItemClickListener接口
        Log.e("MainFragment ", "   mListItemClickListener  1");
        mListItemClickListener = (onListItemClickListener) getActivity();
        Log.e("MainFragment ", "   mListItemClickListener  2");
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //获得我们在strings.xml中定义个数组
        final String[] items = getResources().getStringArray(R.array.main_items);
        //创建适配器
        final ArrayAdapter<String> adapter = new ArrayAdapter<>(getActivity(),
                android.R.layout.simple_list_item_1, items);
        //设置适配器
        setListAdapter(adapter);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        Log.e("MainFragment ", "   onListItemClick  1");
        if (mListItemClickListener != null) {
            Log.e("MainFragment ", "   onListItemClick  2");
            //由于宿主Activity实现了onListItemClickListener接口
            //因此调用的是宿主Activity的onItemClick方法
            //并且将点击的item的position传给Activity
            mListItemClickListener.**onItemClick**(position);
            Log.e("MainFragment ", "   onListItemClick  3");
        }
    }
}

**实现接口的类 -**
------------

public class RecyclerDeleteActivity extends AppCompatActivity implements MainFragment.onListItemClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_delete);

        //当savedInstanceState为null时才new一个MainFragment出来
        //否则每次旋转屏幕都会new出来一个
        Log.e("RecyclerDeleteActivity ","    new MainFragment()  1");
        if (savedInstanceState == null) {
            MainFragment fragment = new MainFragment();
            //用add将MainFragment添加到framelayout上
            Log.e("RecyclerDeleteActivity ","    new MainFragment()  2");

            getSupportFragmentManager().beginTransaction()
                    .add(R.id.content, fragment)
                    .commit();
        }
    }


    @Override
    public void **onItemClick**(int position) {
        Log.e("RecyclerDeleteActivity ","   onListItemClick  1");
        //当MainFragment的Item被点击后,就会回调此方法
        //在此方法中写真正的逻辑,这样Activity和Fragment
        //之间就是松耦合关系,MainFragment可以复用
        Fragment fragment = null;
        switch (position) {

            case 0:
                //当点击第一个item时候,new一个RecyclerListFragment
                Log.e("RecyclerDeleteActivity ","   onListItemClick  2");
                fragment = new RecyclerListFragment();
                Log.e("RecyclerDeleteActivity ","   onListItemClick  3");
                break;
            case 1:
                //当点击第二个item时候,new一个RecyclerGridFragment
                fragment = new RecyclerGridFragment();
                break;
        }
        //这次用replace,替换framelayout的布局,也就是MainFragment
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.content, fragment)
                .addToBackStack(null)
                .commit();
    }
}

Android中接口回调、方法回调

Android中方法的的回调就是把方法的定义和功能导入实现分开的一种机制,目的是为了解耦,现在来举个例子看看它的应用场合,例如在activity中的listview与adapter类之间的传递: 一、...

一个经典例子让你彻彻底底理解java回调机制

以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中...

Android 中的接口回调

在Android中到处可见接口回调机制,尤其是UI事件处理方面。举一个最常见的例子button点击事件,button有一个点击方法onClick(),我们知道onclick()是一个回调方法,当用户点...

Android 中的接口回调

http://blog.csdn.net/wangjinyu501/article/details/22052187   在Android中到处可见接口回调机制,尤其是UI事件处理方面。举一...
  • subaohao
  • subaohao
  • 2014年03月31日 09:52
  • 70796

android接口回调详解、简单例子+复杂例子

使用接口的核心原因:为了能够向上转型为多个基类型。即利用接口的多实现,可向上转型为多个接口基类型。 1.接口回调是什么? 接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

安卓接口回调原理

在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的...

Android 回调接口是啥,回调机制详解

首先解决啥是回调: 举个例子:某天,我打电话向你请教问题,当然是个难题,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:详解android 接口回调
举报原因:
原因补充:

(最多只允许输入30个字)