【问题标题】:Fragment Manager moveToState loads wrong fragment when tab is swap in viewpager片段管理器Movetostate在ViewPager中换档时加载错误的片段
【发布时间】:2016-05-31 18:38:38
【问题描述】:

我制作了一个图像应用程序,它具有标签主机按钮洞察主活动视图页面,每个标签仅填充 0 片段,最后一个索引视图页面在其中正确加载其他标签加载相邻片段数据

MainActivity.java

    public class MainActivity extends AppCompatActivity {

     private void setUpViewPager() {
            viewPager = (ViewPager) findViewById(R.id.viewpager);
            tabLayout = (TabLayout) findViewById(R.id.tabs);

            setupViewPager(viewPager);
            tabLayout.setupWithViewPager(viewPager);
        }

    private void setupViewPager(ViewPager viewPager) {

            ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
            adapter.addFrag(new EyeMakeupFragment(), "Eye Makeup");
            adapter.addFrag(new EyeBrowMakeupFragment(),"EyeBrow Makeup");
            adapter.addFrag(new LipstickGuideFragment(), "Lipstick Guide");
            adapter.addFrag(new MakeupTipsFragment(), "Makeup Tips");
            adapter.addFrag(new NailArtTutorialsFragment(), "Nail Art Tutorials");
            adapter.addFrag(new WomenHairStylesFragment(), "Women Hair Styles");


            viewPager.setAdapter(adapter);
        }

    public class ViewPagerAdapter extends FragmentPagerAdapter {
            private final List<Fragment> mFragmentList = new ArrayList<>();
            private final List<String> mFragmentTitleList = new ArrayList<>();

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


            @Override
            public Fragment getItem(int position) {

                return mFragmentList.get(position);
            }

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

            public void addFrag(Fragment fragment, String title) {

                mFragmentList.add(fragment);
                mFragmentTitleList.add(title);
            }

            @Override
            public CharSequence getPageTitle(int position) {

                return mFragmentTitleList.get(position);
            }
        }

    }

EyeMakeupFragment.java

public class EyeMakeupFragment extends Fragment {

    public static boolean isEyeMakeUpFragmentActive=false;
    private ImageUtils imageUtils;
    List<String> imagePaths = new ArrayList<>();
    static GridViewAdapter adapter;
    private ExpandableHeightGridView gridView=null;
    private int columnWidth;

    public EyeMakeupFragment() {
        // Required empty public constructor
    }

    @Override
    public void registerForContextMenu(View view) {
        super.registerForContextMenu(view);
    }


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.eye_makeup_fragment, container, false);

        isEyeMakeUpFragmentActive= true;

        EyeBrowMakeupFragment.isEyeBrowMakeUpFragmentActive =false;
        LipstickGuideFragment.isLipStickFragmentActive = false;
        MakeupTipsFragment.isMakeupTipsFragment = false;
        NailArtTutorialsFragment.isNailArtTutorialsFragmentActive =false;
        WomenHairStylesFragment.isWomenHairStyleFragmentActive = false;

        gridView  = (ExpandableHeightGridView) rootView.findViewById(R.id.grid_view);

        imageUtils = new ImageUtils(getContext());

        // Initializing Grid View
        InitializeGridLayout();

        // loading all image paths from Drawable
            imagePaths = imageUtils.getEyeMakeupImageForDisplay(getContext());


        // Gridview adapter
        adapter = new GridViewAdapter(getContext(),imagePaths, columnWidth, gridView);

        // setting grid view adapter
        gridView.setExpanded(true);
        gridView.setAdapter(adapter);
        setGridViewHeightBasedOnChildren(gridView,AppConstant.NUM_OF_COLUMNS);

        return rootView;

    }

    @Override public void setUserVisibleHint(boolean isVisibleToUser) {

        isEyeMakeUpFragmentActive = isVisibleToUser;

        super.setUserVisibleHint(isVisibleToUser);
    }

    private void InitializeGridLayout() {
        Resources r = getResources();
        float padding = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_FRACTION, AppConstant.GRID_PADDING, r.getDisplayMetrics());
        columnWidth = (int) ((imageUtils.getScreenWidth() - ((AppConstant.NUM_OF_COLUMNS + 1) * padding)) / AppConstant.NUM_OF_COLUMNS);
        gridView.setNumColumns(AppConstant.NUM_OF_COLUMNS);
        gridView.setColumnWidth(columnWidth);
        gridView.setStretchMode(GridView.NO_STRETCH);
        gridView.setPadding((int) padding, (int) padding, (int) padding, (int) padding);
        gridView.setHorizontalSpacing((int) padding);
        gridView.setVerticalSpacing((int) padding);
    }


    /**
     * Expendable GirdView ChildItem Function
     * @param gridView
     * @param columns
     */
    public void setGridViewHeightBasedOnChildren(GridView gridView, int columns) {
        ListAdapter listAdapter = gridView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = 0;
        int items = listAdapter.getCount();
        int rows = 0;

        View listItem = listAdapter.getView(0, null, gridView);
        listItem.measure(0, 0);
        totalHeight = listItem.getMeasuredHeight();

        float x = 1;
        if( items > columns ){
            x = items/columns;
            rows = (int) (x + 1);
            totalHeight *= rows;
        }

        ViewGroup.LayoutParams params = gridView.getLayoutParams();
        params.height = totalHeight;
        gridView.setLayoutParams(params);

    }

}

如果标签按钮是交换和加载当前片段数据时,任何人都可以帮助如何通过管理片段?

【问题讨论】:

    标签: android android-fragments tabs android-viewpager android-pageradapter


    【解决方案1】:

    我解决了我在 viewPager.setAdapter 之前应用 setOffscreenPageLiimit 的问题

    viewPager.setOffscreenPageLimit(6) //this line solves behavior of fragment 
    then set  viewPager.setAdapter(adapter);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多