【问题标题】:Changing tabs of TabLayout programmatically but fragments of ViewPager is not updated以编程方式更改 TabLayout 的选项卡,但 ViewPager 的片段未更新
【发布时间】:2016-09-06 06:29:46
【问题描述】:

我正在开发一个 Android 应用程序。在我的应用程序中,我将 TabLayout 与 ViewPager 一起使用。 I need to update the Tabs of TabLayout and its fragments programmatically when an item at the bottom navigation bar is selected.我可以更新 TabLayout 的选项卡。但是pager的片段没有更新。

这是问题:

正如您在上面看到的,选项卡已更改,但其片段未更改。列表片段始终显示。所有片段都与选择的第一个选项卡相同。我的意思是片段根本没有改变。

这是我的标签页和视图分页器的 XML 文件:

 <android.support.design.widget.AppBarLayout android:layout_height="wrap_content"
        android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay">


        <android.support.design.widget.TabLayout
            android:id="@+id/ma_tab_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabGravity="fill"
            app:tabMode="fixed" />

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        android:id="@+id/ma_viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

这是我的全部活动:

public class MainActivity extends AppCompatActivity {

    private BottomBar bottomBar;
    private TabLayout topTabLayout;
    private ViewPager mainViewPager;
    private MainPagerAdapter pagerAdapter;
    private ArrayList<Fragment> pagerFragments;
    private ArrayList<String> pagerTitleList;
    protected TfrApplication app;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        app = (TfrApplication)getApplication();
        setContentView(R.layout.activity_main);
        initialize();
        initViews();
        setUpViews();
    }

    private void initialize()
    {
        pagerFragments = new ArrayList<Fragment>();
        pagerTitleList = new ArrayList<String>();
    }

    private void initViews()
    {
        bottomBar = (BottomBar)findViewById(R.id.ma_bottom_action_bar);
        mainViewPager = (ViewPager)findViewById(R.id.ma_viewpager);
        topTabLayout = (TabLayout)findViewById(R.id.ma_tab_layout);
    }

    private void setUpViews()
    {
        pagerAdapter = new MainPagerAdapter(getSupportFragmentManager(),pagerFragments,pagerTitleList);
        mainViewPager.setAdapter(pagerAdapter);
        topTabLayout.setupWithViewPager(mainViewPager);
        setUpBottomBar();
    }

    private void clearPagerFragments()
    {
        if(pagerAdapter!=null && pagerFragments!=null && pagerFragments.size()>0)
        {
            pagerFragments.removeAll(pagerFragments);
            pagerTitleList.removeAll(pagerTitleList);
            pagerAdapter.notifyDataSetChanged();
        }
    }

    private void setUpNewsPagerFragments()
    {
        NewsFragment latestNewsFragment = new NewsFragment();
        Bundle latestNewsBundle = new Bundle();
        latestNewsBundle.putInt(NewsFragment.FIELD_CATEGORY_ID,0);
        latestNewsBundle.putInt(NewsFragment.FIELD_LEAGUE_ID,0);
        latestNewsBundle.putInt(NewsFragment.FIELD_COUNTRY_ID,0);
        latestNewsBundle.putInt(NewsFragment.FIELD_TEAM_ID,0);
        latestNewsFragment.setArguments(latestNewsBundle);
        pagerTitleList.add("LATEST");
        pagerFragments.add(latestNewsFragment);

        PrioritizedTeamsFragment teamsFragment = new PrioritizedTeamsFragment();
        pagerTitleList.add("TEAMS");
        pagerFragments.add(teamsFragment);

        NewsFragment articlesFragment = new NewsFragment();
        Bundle articlesBundle = new Bundle();
        articlesBundle.putInt(NewsFragment.FIELD_CATEGORY_ID, 0);
        articlesBundle.putInt(NewsFragment.FIELD_LEAGUE_ID, 0);
        articlesBundle.putInt(NewsFragment.FIELD_COUNTRY_ID, 0);
        articlesBundle.putInt(NewsFragment.FIELD_TEAM_ID, 0);
        articlesFragment.setArguments(articlesBundle);
        pagerTitleList.add("ARTICLES");
        pagerFragments.add(articlesFragment);

        TopFragment topFragment = new TopFragment();
        pagerTitleList.add("TOP 10");
        pagerFragments.add(topFragment);
    }

    private void setUpMatchesPagerFragments()
    {
        MatchesFragment matchesFragment = new MatchesFragment();
        pagerTitleList.add("MATCHES");
        pagerFragments.add(matchesFragment);

        StatisticsFragment statisticsFragment = new StatisticsFragment();
        pagerTitleList.add("STATISTICS");
        pagerFragments.add(statisticsFragment);
    }

    private void setUpBottomBar()
    {
        bottomBar.setOnTabSelectListener(new OnTabSelectListener() {
            @Override
            public void onTabSelected(int tabId) {
                switch (tabId){
                    case R.id.bottom_tab_news:
                        clearPagerFragments();
                        setUpNewsPagerFragments();
                        pagerAdapter.notifyDataSetChanged();
                        break;
                    case R.id.bottom_tab_matches:
                        clearPagerFragments();
                        setUpMatchesPagerFragments();
                        pagerAdapter.notifyDataSetChanged();
                        topTabLayout.getTabAt(0).select();
                        break;

                    case R.id.bottom_tab_meme:
                        Toast.makeText(getBaseContext(),"MEME",Toast.LENGTH_SHORT).show();
                        break;

                    case R.id.bottom_tab_settings:
                        Toast.makeText(getBaseContext(),"Settings",Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        });
    }
}

我展示了整个活动,因为对处理该问题的整个活动进行了编码。此外,整个活动只包含用于创建选项卡、视图分页器和底栏的代码。都已连接。

这是我的视图寻呼机适配器:

public class MainPagerAdapter extends FragmentPagerAdapter {
    private ArrayList<Fragment> fragmentList;
    private ArrayList<String> titleList;

    public MainPagerAdapter(FragmentManager fragmentManager,ArrayList<Fragment> fragmentsParam,ArrayList<String> titlesParam)
    {
        super(fragmentManager);
        this.fragmentList = fragmentsParam;
        this.titleList = titlesParam;
    }

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

    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

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

为什么改变tabs时view pager的内容或片段没有改变?我的代码有什么问题?

正如您在底部项目选定的侦听器上看到的那样,我尝试将选定的片段设置为:

topTabLayout.getTabAt(0).select();

我也试过了:

mainViewPager.setCurrentItem(0);

两者都不工作。

【问题讨论】:

    标签: android android-fragments android-viewpager android-tablayout


    【解决方案1】:

    尝试添加一个方法来交换片段列表并在您的适配器中调用notifyDataSetChanged(),如下所示:

    public void notifyDataSetChanged(List<Fragment> list) {
        fragmentList.removeAll();
        fragmentList.addAll(list);
        notifyDataSetChanged();
    }
    

    更改活动中的数据并调用adapter.notifyDataSetChanged() 可能无法更新您的视图。您可以登录getItem() 以检查适配器是否知道数据集已更改。

    【讨论】:

      【解决方案2】:

      只需检查您在 MatchesFragment 类中膨胀的布局。

      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
          v = inflater.inflate(R.layout.matches_fragment, container, false);
      }
      

      【讨论】:

      • 膨胀正确的布局。它不仅仅是更新整个片段集。
      【解决方案3】:

      如果你的选项卡设置正确,在设置选项卡的代码下,再次运行:

      mainViewPager.setAdapter(pagerAdapter);

      这是我的代码:

      selectedTab = 0; tabLayout.getTabAt(selectedTab).select(); viewPager.setAdapter(tabsAdapter);

      【讨论】:

        猜你喜欢
        • 2016-12-03
        • 1970-01-01
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 2021-12-08
        相关资源
        最近更新 更多