2014-02-20 101 views
1

讓我展示我的應用程序的基本結構入手:如何將一個片段中的listadapter事件發送到另一個片段?

    MainActivity      
        | | 
     ------------- ------------         
     |       | 
    SearchFragment   WatchListFragment    
     |       |      
SearchListViewFragment WatchListListViewFragment 
     |       | 
    SearchAdapter    WatchListAdapter   

現在我有地方在列表視圖上點擊一個按鈕在SearchAdapter被處理的情形,這需要產生的ID被點擊的listitem被傳遞到WatchListFragment,所以我可以將該項添加到ListListListViewFragment ...

直接從一個片段傳遞東西到另一個似乎是不好的做法,所以我想我會嘗試接口,從SearchAdapter傳遞ID - > SearchListViewFragment - > SearchFragment - > MainActivity - > WatchListFragment。我不知道自己在做什麼,最後有四個接口看起來差不多。這對我來說並不合適。所以現在我正在考慮嘗試一個由所有相關類實現的單一接口。但是,這也不覺得很正確...

是否有一些標準的方法來做到這一點,我應該使用? 「單一界面」是一個好主意嗎?我嘗試閱讀界面以獲得一個想法,雖然我在簡化的教科書示例中獲得了這個想法,但是這種情況是另一個混​​亂......

+0

最後我用一個完全不同的解決方案都在一起。起初我會讓我的WatchListAdapter擴展ArrayAdapter,但是我意識到如果我讓它們都擴展SimpleCursorAdapter的公共子類,我可以重用我的SearchAdapter中的幾乎所有代碼(它擴展了SimpleCursorAdapter)。因此,按下SearchAdapter中的按鈕會導致數據庫向我的數據庫中的watchlist_table添加條目。 WatchListAdapter在我的數據庫中訂閱一個自定義onChange-listener,並在watchlist_table中執行插入/更新/刪除操作時收到通知。希望可以幫助別人! – BadCash

回答

2

我想在這個特定的情況下,最好的辦法是調解模式。我實際上已經在與原始問題相關的應用程序的另一部分中實現了它。上面的JustSoAmazing的答案僅僅是從SearchAdapter到MainActivity的「消息」,但不是所有到達預期接收者的方式,即WatchListFragment。當然,我們總是可以在MainActivity中實現接口,以便將消息轉發到WatchListFragment。然而,這個解決方案更通用,可以被任何實現AppMediatorInterface的類發送任何消息,使得它非常靈活。



首先我們定義了一個希望訂閱通知的類必須實現一個接口。

AppMediatorInterface。java的

public interface AppMediatorInterface { 

    public void onAppMediatorNotification(Object sender, Object data); 

} 



其次,我們定義實際的中介類,我選擇,使其靜態使它容易獲得應用程序的任何地方。

AppMediator.java

public class AppMediator{ 
    protected static List<AppMediatorInterface> observers = new ArrayList<AppMediatorInterface>(); 

    public static void addObserver(AppMediatorInterface observer){ 
       observers.add(observer); 
    } 

    public static void removeObserver(Object observer){ 
     int pos = observers.indexOf(observer); 

     if(pos>-1) 
      observers.remove(pos); 
    } 

    public static void notifyObservers(Object sender, Object data){ 
     for(int i=0; i<observers.size(); i++){ 
      observers.get(i)).onAppMediatorNotification(sender, data); 
     } 
    } 

} 



發送通知:

SearchAdapter.java

AppMediator.notifyObservers(this, "Add-button clicked"); 



接收通知:

WatchListFragment.java

public class WatchListFragment extends Fragment implements AppMediatorInterface{ 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState);     
     AppMediator.addObserver(this); 
    } 


    @Override 
    public void onDestroy() {  
     AppMediator.removeObserver(this); 
     super.onDestroy(); 
    } 


    /* --- AppMediatorInterface --- */ 
    @Override 
    public void onAppMediatorNotification(Object sender, Object data) { 
     // Do something... 
    } 
}  
+0

感謝您分享此解決方案。它確實有幫助。 @BadCash –

0

擁有一個界面是一種方法。不是在所有相關的類中實現它,而是傳遞偵聽器引用,在處理碎片時可以執行以下操作。

在SearchAdapter類中創建一個公共靜態接口,並讓您的主要活動實現它。

mySearchAdapter.setIdListener(getActivity())

由於活動實現接口,因爲片段具有訪問活動,這是一個完全有效的語句:那麼,在你的SearchListViewFragment類,如下所示設置回調。但是,如果Activity未在接口中實現,您將得到一個ClassCastException。

或者,您可以擁有一系列getter方法,讓您可以從主要活動訪問搜索適配器,並允許您設置回調。

例如,在您的MainActivity類別:getSearchFragment().getSearchListViewFragment().getSearchAdapter().setIdListener(this)

相關問題