在以下链接https://github.com/iPaulPro/Android-ItemTouchHelper-Demo/blob/master/app/src/main/java/co/paulburke/android/itemtouchhelperdemo/MainFragment.java中,Activity对象被转换为名为OnListItemClickListener的内部接口。
mItemClickListener.onListItemClick(position);
MainFragment类的完整源代码如下:
public class MainFragment extends ListFragment {
public interface OnListItemClickListener {
void onListItemClick(int position);
}
private OnListItemClickListener mItemClickListener;
public MainFragment() {
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
mItemClickListener = (OnListItemClickListener) activity;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
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) {
mItemClickListener.onListItemClick(position);
}
}
为什么活动对象被转换为接口?
stackoverflow How is it possible to cast an Android Activity to an interface?也有类似的问题,但对我来说不满意,它不回复我的问题。
答案 0 :(得分:1)
此接口未在代码中的任何位置实现,或者我看不到它
请参阅this line:
public class MainActivity extends ActionBarActivity implements MainFragment.OnListItemClickListener {
但我看不到此方法的任何其他实现..
请参阅these lines:
@Override
public void onListItemClick(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = new RecyclerListFragment();
break;
case 1:
fragment = new RecyclerGridFragment();
break;
}
getSupportFragmentManager().beginTransaction()
.replace(R.id.content, fragment)
.addToBackStack(null)
.commit();
}
为什么活动对象被转换为接口?
这是合约模式的典型实现。该片段要求其托管活动实现某个接口。这样,片段不关心特定活动类是托管它的那个。
答案 1 :(得分:1)
要扩展@CommonsWare,请回答为什么必须将其转换为OnListItemClickListener
。 onAttach
的{{1}}生命周期方法接受任何Fragment
- 并且Activity
没有Activity
作为默认值实施。
所以编译器不知道这一点,但是你知道MainFragment.OnListItemClickListener
已经实现了它,并且使用强制转换你告诉编译器MainActivity
。
答案 2 :(得分:0)
您必须开展活动implements MainFragment.OnListItemClickListener
。
此外,在您的活动中,您将需要实现函数void onListItemClick(int position)
。