简体   繁体   English

Android在TabLayout中,ViewPager片段无法持续更新

[英]Android in TabLayout, ViewPager Fragments not updating consistantly

I have a TabLayout and ViewPager in my android application. 我的Android应用程序中有一个TabLayout和ViewPager。 But when i use swipe for changing "Tab1" to "Tab2" and use click on "Tab1" to go back to first tab then fragment inside my viewpager is not updated. 但是,当我使用滑动将“ Tab1”更改为“ Tab2”并使用“ Tab1”单击返回第一个选项卡时,viewpager中的片段不会更新。

Similar problem exist if i use swipe to move from "Tab2" to "Tab3" and then try to click on tab to move back to Tab2. 如果我使用滑动从“ Tab2”移动到“ Tab3”,然后尝试单击选项卡以移回到Tab2,则存在类似的问题。

Otherwise the TabLayout works fine all tabs will be updated and proper fragments are shown if i use any other combination of swipes or clicks. 否则,如果我使用任何其他组合的滑动或单击,则TabLayout可以正常工作,所有选项卡都将被更新并显示适当的片段。

        //set tabs and viewpager
    ViewPager viewPager = (ViewPager) findViewById(R.id.mViewPager);
    viewPager.setAdapter(new MyFragmentPageAdapter(getSupportFragmentManager(), MainActivity.this));

    //layout
    TabLayout tabLayout= (TabLayout) findViewById(R.id.mTabs);
    tabLayout.setupWithViewPager(viewPager);

You should implement setOnTabSelectedListener : 您应该实现setOnTabSelectedListener

tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
           viewPager.setCurrentItem(tab.getPosition());
        }
});

Its late but i figured a best way out using FragmentPagerAdapter 它晚了,但我想出了使用FragmentPagerAdapter的最佳方法

First in all of the fragments used in the viewpager create method as below. 首先,在viewpager create方法中使用的所有片段如下所示。

public void updateView() {
  //Update whatever views or data you want to update
}

Also override method setUserVisibleHint which is used in FragmentPagerAdapter to notify if the fragment is visible to user or not. 还要重写FragmentPagerAdapter中使用的setUserVisibleHint方法,以通知该片段是否对用户可见。

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        this.isVisibleToUser = isVisibleToUser;
        super.setUserVisibleHint(isVisibleToUser);
    }

finally in your fragment add the following code to update the view/date when the fragment is visible. 最后,在片段中添加以下代码,以在片段可见时更新视图/日期。

@Override
    public void onStart() {
            if (isVisibleToUser)
                updateView();
    }

Then implement this in your TabFragment or Activity 然后在您的TabFragment或Activity中实现

viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

                switch (position) {
                    case 0: {
                         ((Fragment) mFragmentList.get(0)).updateView();
                        break;
                    }
                    case 1: {
                         ((Fragment) mFragmentList.get(1)).updateView();
                        break;
                    }
                }
            }

This will take care of update the data consistantly, either you swipe or you click the tab, its well tested , if anyone finds any issues or bugs, please comment and let me know or feel free to edit the solution. 滑动或单击选项卡,即经过良好测试的数据包,将始终如一地更新数据,如果有人发现任何问题或错误,请发表评论,并让我知道或随时编辑解决方案。

try this 尝试这个

mViewPager.setOffscreenPageLimit(2); // if you use 3 tabs 
mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                mTabLayout.getTabAt(position).select();
            }
});

watch out with mViewPager.setOffscreenPageLimit(2); 留意mViewPager.setOffscreenPageLimit(2); the default values is 1 but I had some trouble using it with a recyclerview 默认值为1,但在recyclerview中使用它时遇到了一些麻烦

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM