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

这一切的原因是为了更新Bundle
outState
以进行配置更改-
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()
方法,而不是您实现的本地日志记录方法。

谢谢您的输入!