首页 > 编程知识 正文

Android Adapter中获取FragmentManager

时间:2023-11-21 00:40:47 阅读:289330 作者:QBNY

本文将从以下几个方面探究如何在Android Adapter中获取FragmentManager:

一、PagerAdapter中获取FragmentManager

ViewPager常用的PagerAdapter中提供了获取FragmentManager的方法,只需在Adapter中覆盖getPageTitle方法,并传入FragmentManager即可:

public class MyPagerAdapter extends FragmentPageAdapter {

    private FragmentManager mFragmentManager;

    public MyPagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
        mFragmentManager = fragmentManager;
    }

    @Override
    public Fragment getItem(int position) {
        //返回对应的Fragment
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return "Title" + position;
    }

    public FragmentManager getFragmentManager() {
        return mFragmentManager;
    }
}

二、FragmentStatePagerAdapter中获取FragmentManager

FragmentStatePagerAdapter和PagerAdapter类似,也提供了获取FragmentManager方法。只需要在Adapter中重载getItemPosition方法,并传入FragmentManager即可:

public class MyFragmentStatePagerAdapter extends FragmentPagerAdapter {

    private FragmentManager mFragmentManager;

    public MyFragmentStatePagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
        mFragmentManager = fragmentManager;
    }

    @Override
    public Fragment getItem(int position) {
        //返回对应的Fragment
    }

    @Override
    public int getCount() {
        return 5;
    }

    public FragmentManager getFragmentManager() {
        return mFragmentManager;
    }

    @Override
    public int getItemPosition(Object object) {

        if (object instanceof Fragment) {
            //判断Fragment是否被添加到FragmentManager,
            Fragment fragment = (Fragment) object;

            if (fragment.isAdded()) {
                return POSITION_UNCHANGED; //未改变
            } else {
                return POSITION_NONE; //已改变
            }
        }

        return super.getItemPosition(object);
    }
}

三、RecyclerView Adapter中获取FragmentManager

在RecyclerView的Adapter中,我们需要实现ViewHolder。当我们需要在Adapter中进行Fragment的操作时,需要将FragmentManager传入ViewHolder中:

public class MyAdapter extends RecyclerView.Adapter {

    private Context mContext;
    private FragmentManager mFragmentManager;

    public MyAdapter(Context context, FragmentManager fragmentManager) {
        mContext = context;
        mFragmentManager = fragmentManager;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(mContext).inflate(R.layout.item_view, parent, false);
        return new ViewHolder(itemView, mFragmentManager);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        //在ViewHolder中更新Fragment
        holder.updateFragment();
    }

    @Override
    public int getItemCount() {
        return 5;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        private FragmentManager mFragmentManager;

        public ViewHolder(View itemView, FragmentManager fragmentManager) {
            super(itemView);
            mFragmentManager = fragmentManager;
        }

        public void updateFragment() {
            FragmentTransaction transaction = mFragmentManager.beginTransaction();
            //更新Fragment
            transaction.commit();
        }
    }
}

四、在Fragment中获取FragmentManager

有时候我们需要在Fragment中获取FragmentManager,这时可以通过getFragmentManager()方法获取:

public class MyFragment extends Fragment {

    public interface Callback {
        FragmentManager getFragmentManager();
    }

    private Callback mCallback;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            mCallback = (Callback) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement Callback");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mCallback = null;
    }

    public FragmentManager getFragmentManager() {
        return mCallback.getFragmentManager();
    }
}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。