我正在将我的应用的ListView转换为RecyclerView。在ListView上,实现OnClickListener非常容易,但在RecyclerView中,我们必须在适配器中执行它。我想在用户点击某个项目时打开一个新的片段。要做到这一点,我必须在适配器中调用FragmentManager,我无法做到。 这是我的RecyclerAdapter代码:
public ListItemViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.title);
description = (TextView) itemView.findViewById(R.id.description);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//Call FragmentManager and add Fragment to it.
}
}
那么,如何调用FragmentManager并在其中添加Fragments。有没有比sendBroadcast或任何其他方法更好的方法。
答案 0 :(得分:48)
您只需要在构造函数中传递一个活动上下文。请务必从活动中调用new Adapter(this,...)
,从片段调用new Adapter(getActivity(),...)
。
private Context context;
@Override
public void onClick(View v) {
FragmentManager manager = ((AppCompatActivity)context).getSupportFragmentManager();
}
答案 1 :(得分:42)
要添加到已批准的答案:如果仍然出现错误,则可能需要替换此行;
FragmentManager manager = ((Activity)context).getFragmentManager();
有了这个
FragmentManager manager = ((AppCompatActivity)context).getSupportFragmentManager();
对我而言,这是因为我使用的是support.v4.app.FragmentManager
而不是常规fragmentmanager
仍然出错?
正如下面的一条评论所指出的,这可能会抛出java.lang.ClassCastException:
并记录... cannot be cast to android.support.v7.app.AppCompatActivity
(查看评论以获取详细信息)
他们的解决方法是使用它(我没有测试它,但它适用于它们):
((AppCompatActivity)activity).getSupportFragmentManager()
答案 2 :(得分:5)
确保将上下文传递给ArrayAdapter或RecyclerViewAdpater,以便我们可以在Adapter Class中获取它。
如果您的mainActivity正在扩展活动,请使用:
FragmentManager fragmentManager = ((Activity)context).getFragmentManager();
如果您的mainActivity正在扩展AppCompatActivity,请使用:
FragmentManager fragmentManager = ((AppCompatActivity)context).getSupportFragmentManager();
答案 3 :(得分:4)
最好的选择可能是让Fragment实例化RecyclerAdapter来实现和接口:
BidiMap
答案 4 :(得分:2)
您只需要在构造函数中传递一个活动上下文。请务必从活动中调用新Adapter(this,...)
,从片段调用new Adapter(getActivity(),...)
。
private Context context;
@Override
public void onClick(View v) {
FragmentManager manager = ((Activity) context).getFragmentManager();}
答案 5 :(得分:1)
我知道这对你来说已经太晚了,但对于那些可能会看到这一点的人来说已经太晚了。
因此,当你第一次初始化适配器时,你可以传递片段的上下文,而不是m vai。
因此,在适配器的构造函数中,您可以添加像这样的参数
// variable to hold fragment
private Fragment fragment;
public MyCustomAdapter(Fragment fragment)
{
this.fragment = fragment;
}
在您的片段中,您可以像这样初始化
MyCustomAdapter myAdapter = new MyCustomAdapter(this);
最后你可以打电话
Fragment fragment = new myNewFragment();
FragmentManager fragmentManager = context.getFragmentManager();
fragmentManager.beginTransaction().replace(R.id.fragment_container, fragment)
.commit();
所以你可以开始一个新片段
答案 6 :(得分:1)
在活动本身中实例化fragmentManager。
FragmentManager fragmentManager = getFragmentManager();
adapter = new CustomAdapter(productsList, fragmentManager);
CustomAdapter implements MyClickListner{
CustomAdapter(Arraylist<MyProduct>productsList, FragmentManager fragmentManager) {
this.productList = productsList;
this.fragmentManager = fragmentManager;
}
@override
clickFunction(){
Fragment myFragment= new MyFilterFragment();
((MyFilterFragment) myFragment).show(this.fragmentManager,"tag");
}
public interface MyClickListener(){
public clickFunction();
}
答案 7 :(得分:1)
在kotlin中,您可以使用以下代码:
val fm : FragmentManager= (context as AppCompatActivity).supportFragmentManager
答案 8 :(得分:0)
您可以在创建viewholder时传递FragmentManager引用,以便Viewholder的类可以如下
class ListItemViewHolder {
FragmentManager manager;
public ListItemViewHolder(View itemView,FragmentManager manager) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.title);
description = (TextView) itemView.findViewById(R.id.description);
itemView.setOnClickListener(this);
this.manager = manager;
}
@Override
public void onClick(View v) {
//Call FragmentManager and add Fragment to it.
manager.beginTransaction...
}
}