本文将从以下几个方面探究如何在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(); } }