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

                }

            }
        });
}