Android 如何从适配器类调用getsupportfragmentmanager()?
我将Android 如何从适配器类调用getsupportfragmentmanager()?,android,Android,我将ViewPager作为RecyclerView中的第一项。我想将FragmentStatePagerAdapter设置为onBindViewHolder()方法中的ViewPager。 但是我不能调用getsupportfragmentmanager()。请帮忙!!。 这是我的密码: public class CustomListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private
ViewPager
作为RecyclerView
中的第一项。我想将FragmentStatePagerAdapter
设置为onBindViewHolder()
方法中的ViewPager
。
但是我不能调用getsupportfragmentmanager()
。请帮忙!!。
这是我的密码:
public class CustomListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<RowItem> rowItemList;
private final int VIEW_TYPE_CUSTOM = 0;
private final int VIEW_TYPE_NORMAL = 1;
NewPagerAdapter mCustomPagerAdapter;
public CustomListAdapter(Context context, List<RowItem> rowItemList) {
this.context = context;
this.rowItemList = rowItemList;
}
@Override
public int getItemViewType(int position) {
if (position == 0)
return VIEW_TYPE_CUSTOM;
else
return VIEW_TYPE_NORMAL;
}
@Override
public int getItemCount() {
return rowItemList.size()+1;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (getItemViewType(position)) {
case VIEW_TYPE_CUSTOM:
recViewHolder1 viewHolderSecond = (recViewHolder1) holder;
mCustomPagerAdapter = new NewPagerAdapter(getSupportFragmentManager());
viewHolderSecond.vPager.setAdapter(mCustomPagerAdapter);
break;
case VIEW_TYPE_NORMAL:
recViewHolder2 viewHolderFirst = (recViewHolder2) holder;
RowItem rowItem = rowItemList.get(position-1);
viewHolderFirst.vName.setText(rowItem.getName());
viewHolderFirst.vImage.setImageResource(rowItem.getImageId());
break;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case VIEW_TYPE_CUSTOM:
View itemView = LayoutInflater.
from(parent.getContext()).
inflate(R.layout.pagerlayout, parent, false);
return new recViewHolder1(itemView);
case VIEW_TYPE_NORMAL:
View itemView1 = LayoutInflater.
from(parent.getContext()).
inflate(R.layout.rowlayout, parent, false);
return new recViewHolder2(itemView1);
}
return null;
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
public static class recViewHolder1 extends RecyclerView.ViewHolder {
protected static ViewPager vPager;
public recViewHolder1(View v) {
super(v);
vPager = (ViewPager) v.findViewById(R.id.vPager);
}
}
public class recViewHolder2 extends RecyclerView.ViewHolder implements View.OnClickListener {
protected TextView vName;
protected ImageView vImage;
public recViewHolder2(View v) {
super(v);
v.setOnClickListener(this);
vName = (TextView) v.findViewById(R.id.vName);
vImage = (ImageView) v.findViewById(R.id.vImage);
} } }
公共类CustomListAdapter扩展了RecyclerView.Adapter{
私人语境;
私有列表行项目列表;
私有最终整型视图\类型\自定义=0;
私有最终int视图类型正常=1;
NewPagerAdapter MCUSCompagerAdapter;
公共CustomListAdapter(上下文上下文,列表rowItemList){
this.context=上下文;
this.rowItemList=rowItemList;
}
@凌驾
public int getItemViewType(int位置){
如果(位置==0)
返回视图\类型\自定义;
其他的
返回视图类型正常;
}
@凌驾
public int getItemCount(){
返回rowItemList.size()+1;
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
开关(getItemViewType(位置)){
案例视图\类型\自定义:
recViewHolder1 viewHolderSecond=(recViewHolder1)支架;
mCustomPagerAdapter=newNewPageRadapter(getSupportFragmentManager());
viewHolderSecond.vPager.setAdapter(mCustomPagerAdapter);
打破
案例视图类型正常:
recViewHolder2 viewHolderFirst=(recViewHolder2)holder;
RowItem RowItem=rowItemList.get(位置-1);
viewHolderFirst.vName.setText(rowItem.getName());
viewHolderFirst.vImage.setImageResource(rowItem.getImageId());
打破
}
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
开关(视图类型){
案例视图\类型\自定义:
视图项视图=布局调整器。
来自(parent.getContext())。
充气(R.layout.pagerlayout,父项,false);
返回新的recViewHolder1(itemView);
案例视图类型正常:
View itemView1=布局调整器。
来自(parent.getContext())。
充气(R.layout.rowlayout,父级,false);
返回新的recViewHolder2(itemView1);
}
返回null;
}
@凌驾
公共长getItemId(int位置){
返回super.getItemId(位置);
}
公共静态类recViewHolder1扩展了RecyclerView.ViewHolder{
受保护的静态ViewPager vPager;
公共recViewHolder1(视图v){
超级(五);
vPager=(ViewPager)v.findViewById(R.id.vPager);
}
}
公共类recViewHolder2扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
受保护的文本视图vName;
保护图像视图图像;
公共记录持有者2(视图v){
超级(五);
v、 setOnClickListener(此);
vName=(TextView)v.findviewbyd(R.id.vName);
vImage=(ImageView)v.findViewById(R.id.vImage);
} } }
首先必须将上下文传递给适配器构造函数 然后您必须使用该上下文引用来获取
getSupportFragmentManager
mCustomPagerAdapter = new NewPagerAdapter(context.getSupportFragmentManager());
viewHolderSecond.vPager.setAdapter(mCustomPagerAdapter);
我通过铸造McContext解决了这个问题
((FragmentActivity)mContext).getSupportFragmentManager().beginTransaction()
.replace(R.id.item_detail_container, fragment)
.commit();
在这里可以设置transition;) 另一个解决方案 声明上下文
private Toast mssgeToast;
private Context ctxContext;
public MyViewListener(myView pView){
this.mView = pView;
this.ctxContext = pView.getContext();
}
接下来
public void pushFragment(Context context){
FragmentManager fm = ((FragmentActivity)context).getSupportFragmentManager();
PopupClickFragment pcf = new PopupClickFragment();
pcf.show(fm, "");
// FragmentTransaction transaction = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction();
}
并声明为onClickListener。
例如:
对于使用kotlin的人,您可以使用此解决方案
val dialog = IntervAddFragment()
val ft = (context as AppCompatActivity).supportFragmentManager.beginTransaction()
dialog.show(ft, ContentValues.TAG)
它将在卡拉完美地工作。它的最佳解决方案是将上下文的引用从活动(或)片段传递给适配器
public UsersAdapter(ArrayList<User> items , Context context) {
usersList = items;
this.context = context;
}
共享以改进。对于出现此错误的用户: 不可逆类型;无法将“android.content.Context”强制转换为YourFragment 我实现了这个解决方案 更新适配器构造函数以接受片段作为参数 比如:
customAdapter = new CustomAdapter(myContext, android.R.layout.simple_list_item_1
, getList, YourFragment.this);
并更新适配器的构造函数:
public CustomAdapter(Context context, int id, YourFragmentfragment) {
this.fragment = fragment;
}
然后使用fragment变量调用方法
fragment.doSomething();
是的
试试这个……它对我有效。我的工作如下:
@Override
public void onBindViewHolder(DataAdapter.ViewHolder holder, final int position) {
holder.txtTitle.setText(list.get(position).getTitle());
holder.txtMessage.setText(list.get(position).getMessage());
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String title = list.get(position).getTitle();
if(title.equals("FRECUENTES")){
RequestFrequentFragment fragment = new RequestFrequentFragment(); // you fragment
FragmentManager fragmentManager = ((FragmentActivity) v.getContext()).getSupportFragmentManager(); // instantiate your view context
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.nav_host_fragment, fragment);// your container and your fragment
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
});
}
您需要在构造函数中将其从活动传递到适配器/Fragment@Nabin找到解决方案了吗?试试这个..这对我很有用..FragmentManager FragmentManager=((FragmentActivity)view.getContext()).getSupportFragmentManager();FragmentTransaction FragmentTransaction=fragmentManager.beginTransaction();根据此建议,我发现运行时错误MainActivity无法转换为android.support.v4.app.FragmentActivityInChanged类型。视图中的视图是什么,getContext()?它在我的代码中的未解析引用
public CustomAdapter(Context context, int id, YourFragmentfragment) {
this.fragment = fragment;
}
fragment.doSomething();
FragmentManager fragmentManager = ((FragmentActivity) view.getContext()).getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
@Override
public void onBindViewHolder(DataAdapter.ViewHolder holder, final int position) {
holder.txtTitle.setText(list.get(position).getTitle());
holder.txtMessage.setText(list.get(position).getMessage());
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String title = list.get(position).getTitle();
if(title.equals("FRECUENTES")){
RequestFrequentFragment fragment = new RequestFrequentFragment(); // you fragment
FragmentManager fragmentManager = ((FragmentActivity) v.getContext()).getSupportFragmentManager(); // instantiate your view context
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.nav_host_fragment, fragment);// your container and your fragment
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
});
}