如何在FragmentStatePagerAdapter中以编程方式销毁Fragment

时间:2015-12-16 09:23:30

标签: android android-fragments tabs fragmentpageradapter fragmentstatepageradapter

我在这里使用MainActivity的SearchView来过滤显示在标签下的列表视图,但是存在状态Fragment的问题。

它完美过滤但是当我选择第一个Tab(ADVISORY)时,它会过滤此标签的子项。选择下一个选项卡(TOP ADVISORY)后,它会过滤此选项卡子项的所有列表视图,但会在之前的选项卡(ADVISORY)中停止过滤。最后我转到EXPERTVIEW它只适用于其他人。

经过大量的调试后,我发现当我们选择另一个Parent Tab时它不会被破坏,所以现在我想知道如何在未选中的情况下从其适配器中删除一个片段并重新选择再次选择。

MainTabFragment.java

 public class MainTabFragment extends Fragment {

public static int position_child_tab = 0, three_childs_tab_position = 0;
static int count = -1, index = 0;
int position_tab = 0;
Bundle args;
int Current_tab = 0;
public static MyTabLayout myTabLayout;
private static MainTabFragment sMainTabFragment;
public static NonSiwpablePager pager;
private Fragment mFragment;
SharedPreferences pref;
private static final int NUM_ITEMS = 2;
List<Integer> TABLE;
public MainTabFragment() {
    // Required empty public constructor
}

public static MainTabFragment getInstance() {
    return sMainTabFragment;
}

/**
 * Use this factory method to create a new instance of
 * this fragment using the provided parameters.
 *
 * @param param1 Parameter 1.
 * @param param2 Parameter 2.
 * @return A new instance of fragment MainTabFragment.
 */
// TODO: Rename and change types and number of parameters
public static MainTabFragment newInstance(String param1, String param2) {

    return new MainTabFragment();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    args = getArguments();
    if (args != null && args.containsKey("pos_next"))
        position_tab = args.getInt("pos_next");
    if (args != null && args.containsKey("pos_end"))
        position_child_tab = args.getInt("pos_end");
    if (position_child_tab != 3) {
        three_childs_tab_position = position_child_tab;
    } else {
        three_childs_tab_position = 0;
    }
    args = new Bundle();
    args.putInt("pos_end", position_child_tab);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.main_tab_fragment, container, false);
    myTabLayout = (MyTabLayout) view.findViewById(R.id.mainTabLayout);
    pager = (NonSiwpablePager) view.findViewById(R.id.pager);

    final ViewPagerAdapter mAdapter = getViewPagerAdapter();
    pager.setAdapter(mAdapter);
    myTabLayout.setupWithViewPager(pager);
    for (int i = 0; i < mAdapter.getCount(); i++) {
        View customView = mAdapter.getCustomeView(getActivity(), i);
        myTabLayout.getTabAt(i).setCustomView(customView);
    }
    pager.setCurrentItem(position_tab);
    pager.setOffscreenPageLimit(NUM_ITEMS-1);
    changeTab();

    final Fragment fragment = getFragmentManager().findFragmentByTag("TOP");
    if (fragment != null) {
        pager.setCurrentItem(position_tab);
    }
    index = pager.getCurrentItem();
    pref = getActivity().getPreferences(0);
    SharedPreferences.Editor edt = pref.edit();
    edt.putInt("facebook_id", pager.getCurrentItem());
    edt.commit();
    //    ViewPagerAdapter adapter = ((ViewPagerAdapter)pager.getAdapter());
    final Fragment fragment22 = mAdapter.getRegisteredFragment(pager.getCurrentItem());

    pager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageSelected(int arg0) {
            // TODO Auto-generated method stub
            pref = getActivity().getPreferences(0);
            SharedPreferences.Editor edt = pref.edit();
            edt.putInt("facebook_id", pager.getCurrentItem());
            edt.commit();
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            // TODO Auto-generated method stub

            //Log.e("Fragment", fragment + "" +pager.getCurrentItem() + fragment22);
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub
            //    Log.e("Fragment", fragment + "" +pager.getCurrentItem() + fragment22);
        }
    });


    myTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            pager.setCurrentItem(tab.getPosition());
            //Log.e("Fragment", fragment + "" +pager.getCurrentItem() + fragment22);
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
           // mAdapter.destroyAllItem();
            //    Log.e("Fragment", fragment + "" +pager.getCurrentItem() + fragment22);
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
            //    Log.e("Fragment", fragment + "" +pager.getCurrentItem() + fragment22);
        }

    });
    return view;
}


public void changeTab() {
    Current_tab = pager.getCurrentItem();
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    myTabLayout.getTabAt(position_tab).getCustomView().setSelected(true);
}

public void setCurrentItem(int item) {
    pager.setCurrentItem(item);
}

private ViewPagerAdapter getViewPagerAdapter() {
    ViewPagerAdapter mAdapter = new ViewPagerAdapter(getChildFragmentManager());
    String title_arr[] = {"ADVISORY", "TOP ADVISORS", "EXPERT VIEW"};
    for (int i = 0; i < title_arr.length; i++) {
        Map<String, Object> map = new Hashtable<>();
        map.put(ViewPagerAdapter.KEY_TITLE, title_arr[i]);
        if (i == 0) {
            map.put(ViewPagerAdapter.KEY_FRAGMENT, AdvisoryPagerFragment.newInstance());
            AdvisoryPagerFragment.newInstance().setTargetFragment(this, getTargetRequestCode());
        } else if (i == 1) {
            map.put(ViewPagerAdapter.KEY_FRAGMENT, TopAdvisoryPagerFragment.newInstance());
            TopAdvisoryPagerFragment.newInstance().setTargetFragment(this, getTargetRequestCode());
        } else if (i == 2) {
            map.put(ViewPagerAdapter.KEY_FRAGMENT, ExperViewPagerFragment.newInstance());
            ExperViewPagerFragment.newInstance().setTargetFragment(this, getTargetRequestCode());
        }
        mAdapter.addFragmentAndTitle(map);

    }
    return mAdapter;
}

public static class ViewPagerAdapter extends FragmentStatePagerAdapter {
    private static final String KEY_TITLE = "fragment_title";
    private static final String KEY_FRAGMENT = "fragment";
    boolean abc = false;
    private int[] drawables = new int[]{R.drawable.advisory_selector, R.drawable.top_advisors_selector, R.drawable.expertview_selector};
    private List<Map<String, Object>> maps = new ArrayList<>();
    private Fragment mCurrentFragment;
    SparseArray<Fragment> registeredFragments = new SparseArray<Fragment>();

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    public View getCustomeView(Context context, int pos) {
        View mView = LayoutInflater.from(context).inflate(R.layout.custom_tab_view, null);
        TextView mTextView = (TextView) mView.findViewById(R.id.textView);
        mTextView.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/ufonts.com_cambria.ttf"));
        ImageView mImageView = (ImageView) mView.findViewById(R.id.imageView2);
        mImageView.setTag(pos);

        /*if(count >0)
        {
            Toast.makeText(context,"Count Is "+count,Toast.LENGTH_SHORT).show();
            mImageView =  (ImageView) mImageView.getTag(0);
            mImageView.setSelected(false);
        }
        */
        mImageView.setImageResource(drawables[pos]);
        mTextView.setText(getPageTitle(pos));
        return mView;
    }

    public void addFragmentAndTitle(Map<String, Object> map) {
        maps.add(map);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return (CharSequence) maps.get(position).get(KEY_TITLE);
    }

    @Override
    public Fragment getItem(int position) {
        Log.e("Fragmentss", (Fragment) maps.get(position).get(KEY_FRAGMENT) + "");
        return (Fragment) maps.get(position).get(KEY_FRAGMENT);
    }

    public Fragment getCurrentFragment() {
        return mCurrentFragment;
    }

    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        if (mCurrentFragment != object) {
            mCurrentFragment = (Fragment) object;
        }
        super.setPrimaryItem(container, position, object);
    }

    @Override
    public int getCount() {
        return maps.size();
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment fragment = (Fragment) super.instantiateItem(container, position);
        registeredFragments.put(position, fragment);
        return fragment;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        registeredFragments.remove(position);
        super.destroyItem(container, position, object);

    }

    public Fragment getRegisteredFragment(int position) {
        return registeredFragments.get(position);
    }

}


}

0 个答案:

没有答案