Java ListAdapter和Fragment之间的接口
我试图解决一个有趣的问题,涉及列表视图适配器和片段之间的通信。我对使用接口很陌生,所以请容忍我 在我的列表视图适配器中,我需要在父片段中触发一个更改,特别是Java ListAdapter和Fragment之间的接口,java,android,android-fragments,Java,Android,Android Fragments,我试图解决一个有趣的问题,涉及列表视图适配器和片段之间的通信。我对使用接口很陌生,所以请容忍我 在我的列表视图适配器中,我需要在父片段中触发一个更改,特别是int成员mediaId: FragmentTitle extends Fragment implements FragmentManager.OnBackStackChangedListener, MediaListView.OnMediaTitleSelectedListener { private i
int
成员mediaId
:
FragmentTitle extends Fragment implements FragmentManager.OnBackStackChangedListener,
MediaListView.OnMediaTitleSelectedListener {
private int mediaId;
// Other properties, methods, etc
// Required interface method implementation
@Override
public void onMediaTitleSelected(int i) {
mediaId = i;
}
}
我在MediaListView适配器类中编写了如下接口:
public interface OnMediaTitleSelectedListener {
void onMediaTitleSelected(int i);
}
在适配器的getView()
方法(MediaListView
)中,调用了onClick方法:
...
// mediaId instantiated here
final int itemMediaId = foo.getMediaId();
OnMediaTitleSelectedListener callback;
item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// I need to "trigger" the event here
callback.onMediaTitleSelected(itemMediaId);
// Other stuff done here... yadda yadda
}
}
现在,我知道我需要实例化这个接口,以免触发NullPointerException,我尝试在MediaListView
类中这样做:
OnMediaTitleSelectedListener callback = new OnMediaTitleSelectedListener() {
@Override
public void onMediaTitleSelected(int i) {
Log.i(TAG, "onMediaTitleSelected: "+ i);
}
};
上面确实记录了单击的结果,但由于这是在MediaListView
类中,因此它不会将事件触发到FragmentTitle
,即使这两个事件在同一布局中并排出现。我也不明白为什么需要上面的内容,因为我在MediaListView
中没有这个接口实现,只在FragmentTitle
中
这一切的原因是为了更新BundleoutState
以进行配置更改-FragmentTitle
,其中MeidaListView
是需要更新上次单击的mediaId
的子项,以便在屏幕旋转后显示相同的内容
我走错方向了吗?现在,我正在向另一个类中的static member添加值,以“保留”mediaId的值,但有消息告诉我,这不是“正确”的方法
谢谢你的帮助 而不是这个
OnMediaTitleSelectedListener callback = new OnMediaTitleSelectedListener() {
@Override
public void onMediaTitleSelected(int i) {
Log.i(TAG, "onMediaTitleSelected: "+ i);
}
};
创建MediaListView时,应该将FragmentTitle作为接口,如
MediaListView mListView = new MediaListView(this,....)
MediaListView的构造函数应该是什么样的
public MediaListView(OnMediaSelectedListener mListener,....){
this.mListener = mListener
...
您的问题是您正在本地安装回调对象(
OnMediaTitleSelectedListener
),即使该对象必须是FragmentTitle
。由于FragmentTitle
实现了OnMediaTitleSelectedListener接口,因此它可以作为适配器构造函数中的OnMediaTitleSelectedListener
对象传递。不知怎的,是这样的:
public MediaListView(OnMediaTitleSelectedListener omtsl, ...){
callback = omtsl;
}
当您实例化MediaListView
适配器时,应该将FragmentTitle
对象作为OnMediaTitleSelectedListener
传递:
FragmentTitle fragmentTitle = new FragmentTitle(...);
MediaListView mediaListView = new MediaListView(fragmentTitle, ...);
这样,您的回调对象将引用
FragmentTitle
,并将调用其onMediaTitleSelected()
方法,而不是您实现的本地日志记录方法。谢谢您的输入!