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