我有一个活动和两个片段,片段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);
我已经尝试了所有类型的上下文,但它无法正常工作
答案 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
中创建适配器