MSa*_*ati 34 android android-fragments
我正在将我的应用程序的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.
}
}
Run Code Online (Sandbox Code Playgroud)
那么,如何调用FragmentManager并在其中添加Fragments.有没有比sendBroadcast或任何其他方法更好的方法.
nat*_*rio 59
您只需要在构造函数中传递一个活动上下文.务必new Adapter(this,...)
从活动和new Adapter(getActivity(),...)
片段中调用.
private Context context;
@Override
public void onClick(View v) {
FragmentManager manager = ((AppCompatActivity)context).getSupportFragmentManager();
}
Run Code Online (Sandbox Code Playgroud)
Isa*_*tim 42
要添加到已批准的答案:如果仍然出现错误,则可能需要替换此行;
FragmentManager manager = ((Activity)context).getFragmentManager();
Run Code Online (Sandbox Code Playgroud)
有了这个
FragmentManager manager = ((AppCompatActivity)context).getSupportFragmentManager();
Run Code Online (Sandbox Code Playgroud)
对我来说这是因为我使用的是support.v4.app.FragmentManager
而不是常规的fragmentmanager
仍然出错?
正如下面的一条评论所指出的,这可能会抛出一个java.lang.ClassCastException:
和日志... cannot be cast to android.support.v7.app.AppCompatActivity
(查看详细评论)
他们的解决方法是使用它(我没有测试它,但它适用于它们):
((AppCompatActivity)activity).getSupportFragmentManager()
Run Code Online (Sandbox Code Playgroud)
最好的选择可能是使Fragment实例化RecyclerAdapter来实现和接口,如下所示:
public class MyRecyclerAdapter extends Adapter<RecyclerAdapter.ViewHolder> {
private ItemType[] mItems;
private MRAItemClickedListener mListener;
public MyRecyclerAdapter(Context ctx, MRAItemClickedListener listener){
mListener = listener;
...
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.itemView.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
mListener.onItemClicked(mItems[position]);
}
});
}
interface MRAItemClickedListener {
void onItemClicked(ItemType item);
}
}
public class MyFragment ... implements MRAItemClickedListener {
public void onItemClicked(ItemType item){
// do stuff with item
}
}
Run Code Online (Sandbox Code Playgroud)
确保将上下文传递给ArrayAdapter或RecyclerViewAdpater,以便我们可以在Adapter Class中获取它.
如果您的mainActivity正在扩展Activity,那么使用:
FragmentManager fragmentManager = ((Activity)context).getFragmentManager();
Run Code Online (Sandbox Code Playgroud)
如果您的mainActivity正在扩展AppCompatActivity,那么使用:
FragmentManager fragmentManager = ((AppCompatActivity)context).getSupportFragmentManager();
Run Code Online (Sandbox Code Playgroud)
小智 5
在 kotlin 中你可以使用这段代码:
val fm : FragmentManager= (context as AppCompatActivity).supportFragmentManager
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
39378 次 |
最近记录: |