设计问题 - 在RecyclerView和Fragments之间进行通信

时间:2017-02-28 13:15:42

标签: android android-fragments android-recyclerview

我有一个活动和两个片段,片段A和片段B.片段A包含RecyclerView。在它的适配器(MovieRecyclerAdapter)中,我有一个接口,用于中继点击回片段A的列的ID。

以下是适配器中的界面:

private MovieClickedListener movieClickedListener;

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

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

我在Fragment Class中实现它以检索数据。

implements MovieRecyclerAdapter.MovieClickedListener

我现在有了数据。这是我的问题,我需要将它传递给片段B.我知道我可以实现另一个在Fragment A和我的Activity之间进行通信的接口,将其传递给那里,然后在我的Activity中检索它并传递id片段B。

我想知道这是否是正确的策略,或者是否有更有效的方法将点击的ID从FragmentA中的RecyclerView获取到片段B?

我尝试直接在我的Activity而不是FragmentA中实现我的RecyclerView界面,但是现在点击一个项目时没有任何事情发生。

以下是Activity中带有简单Log语句的clickedListener。

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

问题如果我这样做,在Activity中实现clickedListener而不是片段,当我在片段中实例化我的RecyclerView时,我再也无法通过"这个"作为适配器的构造函数参数。

movieRecyclerAdapter = new MovieRecyclerAdapter(this);

我已经尝试了所有类型的上下文,但它无法正常工作

4 个答案:

答案 0 :(得分:2)

到你问题的最后一部分:

如果要在活动中实现界面,可以在片段中添加此代码:

@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。真实的电影对象由单身经理类管理。因此,如果我点击一个项目,我会创建一个新的Intent并将一个包中的电影ID传递给新的活动。如果我想访问电影对象,我必须调用manager.getInstance().getMovie(movieid);之类的东西。所以我使用传递的movieid来访问真实对象。

答案 1 :(得分:1)

您可以通过以下方式将活动回调作为参数传递:

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

答案 2 :(得分:0)

你是否在片段中的片段或活动之间传递了监听器?如果是,它将在接收方创建另一个监听器实例。

现在在你的情况下,你需要检查observable和observer。 https://stackoverflow.com/a/40627973/3728591

答案 3 :(得分:0)

让FragmentB实现MovieClickedListener

你的Activity有两个片段的实例,比如说活动

中的fragA和fragB

在活动中呼叫

fragA.setMovieClickedListener(fragB);

在FragmentA中添加方法

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

现在您的适配器具有FragmentB

的侦听器

注意:应首先在fragmentA

中创建适配器