2016-08-04 49 views
1

我有一個有趣的問題,我試圖解決列表視圖適配器和片段之間的通信。我對使用接口很陌生,所以請耐心等待。ListAdapter和片段之間的接口

在我的列表視圖適配器,我需要觸發父片段的變化 - 特別是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); 
} 

在適配器(MediaListView)的getView()方法,有調用一個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

這樣做的原因是所有更新包outState配置更改 - FragmentTitle,其中MeidaListView是一個孩子需要更新的最後點擊mediaId,使屏幕旋轉後,同樣的事情出現了。

我該怎麼做呢?現在,我將該值添加到另一個類中的靜態成員以「保留」mediaId的值,但有些事情告訴我這不是「正確」的方式。

感謝您的幫助!

回答

2

你問題在於你正在安裝回調對象(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()方法,而不是本地日誌記錄方法,就像你實現的。

+1

感謝您的輸入! – mwieczorek

0

取而代之的是

OnMediaTitleSelectedListener callback = new OnMediaTitleSelectedListener() { 
@Override 
public void onMediaTitleSelected(int i) { 
    Log.i(TAG, "onMediaTitleSelected: "+ i); 
} 
}; 

創建MediaListView時,像

MediaListView mListView = new MediaListView(this,....) 

你應該給你的FragmentTitle的界面,MediaListView的構造會像

public MediaListView(OnMediaSelectedListener mListener,....){ 
    this.mListener = mListener 
    ...