2017-02-28 28 views
0

我有一個活動和兩個片段,片段A和片段B.片段A包含一個RecyclerView。在它的適配器(MovieRecyclerAdapter)我有一箇中繼列的ID點擊回片段A.設計問題 - RecyclerView和片段之間的通信

這裏是在適配器接口接口:

private MovieClickedListener movieClickedListener; 

public interface MovieClickedListener{ 
    void onCLicked(int Id); 
} 

public MovieRecyclerAdapter(MovieClickedListener listener){ 
    this.movieClickedListener = listener; 
} 

我在片段類實現這個以檢索數據。

implements MovieRecyclerAdapter.MovieClickedListener 

我現在有數據。這是我的問題,我需要將它傳遞給片段B.我知道我可以實現另一個在片段A和我的Activity之間進行通信的接口,將它傳遞到那裏,然後在我的Activity中檢索它並將ID傳遞給片段B.

我想知道如果這是正確的策略,或者如果有一個更高效的方式獲得點擊ID從RecyclerView在FragmentA到片段B?

我試圖從我的RecyclerView直接在我的Activity而不是FragmentA實現接口,但是現在當我單擊一個項目時沒有任何事情發生。

這裏是活動中的clickedListener和簡單的Log語句。

public class MainActivity extends AppCompatActivity implements MovieRecyclerAdapter.MovieClickedListener { @Override 
public void onCLicked(int Id) { 
    Log.v("TAG","In MainActivity") 
}} 

的問題,如果我做這個,落實活動中的clickedListener而不是片段,當我實例化我RecyclerView在我的片段,我不能再通過「本」作爲構造參數轉接器。

movieRecyclerAdapter = new MovieRecyclerAdapter(this); 

我已經嘗試了所有類型的上下文,它不會工作

+0

請張貼在您實現點擊式界面活性內部 –

+0

我更新了它上面 –

回答

1

你的問題的最後一節創建:

如果你想實現你的活動,你可以在界面在您的片段添加以下代碼:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 

    if (context instanceof MovieRecyclerAdapter.MovieClickedListener){ 
    // save the interface in a field 
    callback = (MovieRecyclerAdapter.MovieClickedListener) context; 
    } 
} 

然後你就可以初始化你的適配器是這樣的:

movieRecyclerAdapter = new MovieRecyclerAdapter(callback); 

現在我推薦:

如果我不介意你,你想單擊recyclerview的一個項目並打開/切換到另一個片段。在我的應用程序,我有一個類似的問題,並像這樣解決:

我有一個recyclerview其中的項目代表電影對象。我總是與電影ID一起工作。真正的電影對象是由一個單獨的管理員類管理的。所以,如果我點擊一個項目,我創建一個新的意圖,並將電影中的電影ID傳遞給新的活動。如果我想訪問電影對象,我必須調用類似manager.getInstance().getMovie(movieid);的東西。所以我使用傳遞的movieid來訪問真實的對象。

+0

我很困惑,回調什麼碼變量在onAttach()方法中 –

+0

此變量是您在MainActivity中實現的接口。你可以隨意調用它。例如movieclicklistener。我只是將它命名爲回調函數,因爲它執行了一個在「之前」類中實現的函數,因此您正在對函數實現的類進行「回調」。 – beeb

0

你已經通過捆綁片段或活性的聽衆?如果是,它將在接收端創建另一個監聽器實例。

現在在你的情況下,你需要檢查有關observable和observer。 https://stackoverflow.com/a/40627973/3728591

0

讓FragmentB已實施MovieClickedListener

你的活動有兩個實例的兩個片段說弗拉加和fragB在活動

在活動的呼叫中FragmentA

fragA.setMovieClickedListener(fragB); 

Add方法

public void setMovieClickedListener(MovieClickedListener listener){ 
adapter.setMovieClickedListener(listner); 
} 
現在210

適配器具有監聽FragmentB

注:適配器應先在fragmentA

1

可以傳遞活動回調的參數是這樣的:

movieRecyclerAdapter = new MovieRecyclerAdapter((MovieRecyclerAdapter.MovieClickedListener) getActivity());