2017-02-28 58 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());