设计问题 - 在回收科和碎片之间进行交流



我有一个活动和两个片段,片段A和片段B。在它的适配器(MoviereCyclerAdapter)中,我有一个接口,该接口将列的ID单击回到片段A。

这是适配器中的接口:

private MovieClickedListener movieClickedListener;
public interface MovieClickedListener{
    void onCLicked(int Id);
}
public MovieRecyclerAdapter(MovieClickedListener listener){
    this.movieClickedListener = listener;
}

我在我的片段类中实现了这一点,以检索数据。

implements MovieRecyclerAdapter.MovieClickedListener

我现在有数据。这是我的问题,我需要将其传递给片段B。我知道我可以实现另一个在片段A和我的活动之间传达的接口,将其传递到那里,然后在我的活动中将其检索并将ID传递给FragmentB。

我想知道这是否是正确的策略,或者是否有一种更有效的方法可以从Fragmenta中的RecyClerview获取单击ID到Fragment B?

我尝试直接在活动中而不是Fragmenta中实现Recyclerview的接口

这是活动中使用简单日志语句的ClickedListener。

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);

我已经尝试了所有类型的上下文,它无法使用

到您问题的最后一部分:

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

@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);

现在我建议:

如果我正确地解开您,则要单击回收瓶的项目,然后打开/切换到另一个片段。在我的应用中,我有类似的问题,并这样解决了:

我有一个循环系统,其中项目代表电影对象。我总是使用电影ID。真实的电影对象由Singleton Manager班级管理。因此,如果我单击一个项目,我会创建一个新的意图,然后将电影ID传递给新活动。如果我想访问电影对象,我必须调用manager.getInstance().getMovie(movieid);之类的东西。因此,我使用传递的Movieid访问真实对象。

您可以将活动回调作为参数以这种方式:

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

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

现在,在您的情况下,您需要检查可观察和观察者。https://stackoverflow.com/a/40627973/3728591

让fragmentB实现了movieclickedListener

您的活动都有两个片段的实例,即活动中的fraga和fragb

在活动呼叫中为

fragA.setMovieClickedListener(fragB);

在Fragmenta中添加方法

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

现在,您的适配器有FragmentB的听众

注意:适配器应首先在fragmenta

中创建

最新更新