2015-08-13 53 views
-1

我知道這是鑄造,但我需要解釋爲什麼它是必要的?我試圖完全理解代碼行。省略代碼:mCallback =(OnHeadlineSelectedListener)活動?

public class HeadlinesFragment extends ListFragment { 
OnHeadlineSelectedListener mCallback; 

public interface OnHeadlineSelectedListener { 

    public void onArticleSelected(int position); 
} 


public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ? 
      android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1; 


    setListAdapter(new ArrayAdapter<String>(getActivity(), layout, Ipsum.Headlines)); 
} 

@Override 
public void onStart() { 
    super.onStart(); 

    if (getFragmentManager().findFragmentById(R.id.article_fragment) != null) { 
     getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
    } 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 


    try { 
     mCallback = (OnHeadlineSelectedListener) activity; 
    } catch (ClassCastException e) { 
     throw new ClassCastException(activity.toString() 
       + " must implement OnHeadlineSelectedListener"); 
    } 
} 

@Override 
public void onListItemClick(ListView l, View v, int position, long id) { 

    mCallback.onArticleSelected(position); 


    getListView().setItemChecked(position, true); 
} 

}

+0

發生的事情是你沒有回調,這意味着通知被選中的文章不會成爲可能。無論如何,你爲什麼不移除它並測試會發生什麼?由此產生的堆棧跟蹤將會非常清晰。 – njzk2

回答

0

歡迎StackOverflow的:換句話說,如果我從下面的代碼省略上面的線會發生什麼。您需要保留片段所在容器的引用。這只是將方法/數據發送回活動的一種方式。如果你不使用它,你不能對容器做任何事情。例如,如果您想要更改當前顯示的片段,您可以從片段中攜帶的片段中進行更改,例如按下按鈕或單擊列表項目?因此,基本上,當您執行mCallback.methodName()時,您在活動中擁有的公共方法將顯示出來。 mCallback被稱爲「委託」。它代表另一個班級執行操作。

如果您想了解更多:http://www.javaworld.com/article/2077357/learn-java/delegates.html

+0

爲什麼我應該將活動投射到一個接口來使用接口的方法?我可以簡單地在我的main.java中實現它。 –

+0

在你的main.java中實現了什麼?做實現fragmentName然後使用它們的方法將什麼也不做,它沒有參考應用程序上下文 – Ben