详解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 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();    }}

更多相关文章

  1. Android中TouchEvent触摸事件机制
  2. Android(安卓)事件分发
  3. Android(安卓)开发之拦截EditText的输入内容,定制输入内容
  4. android 识别U盘以及读写文件的方法
  5. Android仿小米商城底部导航栏(基于BottomNavigationBar)
  6. Android四大组之ContentProvider
  7. Android(安卓)ArrayList LinkedList Set HashMap的介绍
  8. Android(安卓)Dependencies小差号引起的问题
  9. [转]Android读写XML(中)——SAX

随机推荐

  1. Linux系统实战——批量无人值守安装操作
  2. LNMP架构应用实战——PHP扩展及缓存插件
  3. Matlab基本运算3
  4. LNMP架构应用实战——openssl升级最新版
  5. Matlab基础语法4
  6. Linux系统——KVM虚拟机安装与管理
  7. Matlab基本语法5
  8. NPOI 导入XLS文件报错
  9. Matlab基本语法7
  10. scrapy-redis爬虫如何发送POST请求