Android 设置viewpager的每个选项卡的名称

Android 设置viewpager的每个选项卡的名称,android,android-viewpager,fragmentpageradapter,Android,Android Viewpager,Fragmentpageradapter,目前,我有七个标签页,实际上是空白的,即“”。这些值将被更改为我正在通过如下所示的方法调用传递的String[]数组的值 所以我在我的一个类中有这样的方法: CustomTabAdapter customTabAdapter = new CustomTabAdapter(); customTabAdapter.setTabNames(temps); 基本上,这会为片段页面设置选项卡名称,但不会更新实际选项卡。当我通过for循环打印此类中的temps时,它会打印temps中的所有名称-这意味着t

目前,我有七个标签页,实际上是空白的,即
”。这些值将被更改为我正在通过如下所示的方法调用传递的
String[]
数组的值

所以我在我的一个类中有这样的方法:

CustomTabAdapter customTabAdapter = new CustomTabAdapter();
customTabAdapter.setTabNames(temps);
基本上,这会为
片段页面设置选项卡名称,但不会更新实际选项卡。当我通过
for循环打印此类中的
temps
时,它会打印
temps
中的所有名称-这意味着temps存在,但它从不更新选项卡

我相信它不会更新,因为我没有覆盖我的
CustomTabAdapter
类中的原始值,但下面是我的
CustomTabAdapter
类:

public class CustomTabAdapter extends FragmentPagerAdapter {

    String names[];
    Context context;

    public CustomTabAdapter(FragmentManager fragmentManager, Context context){
        super(fragmentManager);
        this.context = context;
        names = new String[7];
        Arrays.fill(names, "");
    }

    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                return new TabOne();
            case 1:
                return new TabTwo();
            case 2:
                return new TabThree();
            case 3:
                return new TabFour();
            case 4:
                return new TabFive();
            case 5:
                return new TabSix();
            case 6:
                return new TabSeven();
            default:
                return null;
        }
    }

    public void setTabNames(String[] input){
        names = Arrays.copyOf(input, input.length);
    }

    @Override
    public int getCount() {
        return names.length;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return names[position];
    }
}
这是我的
选项卡界面
,我在这里显示所有选项卡:

public class TabsViewGUI extends AppCompatActivity {
    TabLayout tabLayout;
    ViewPager viewPager;
    ActionBar actionBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.users_page);
        viewPager = (ViewPager) findViewById(R.id.viewPagerUsers);
        CustomTabAdapter customTabAdapter = new CustomTabAdapter(getSupportFragmentManager(), TabsViewGUI.this);
        viewPager.setAdapter(customTabAdapter);
        viewPager.setOffscreenPageLimit(customTabAdapter.getCount());
        populate();
        tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {
                //viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {
                //viewPager.setCurrentItem(tab.getPosition());
            }
        });
    }
}
如何更新选项卡名称,因为它们目前似乎没有更新


谢谢

在您更新名称后,我通过调用
notifyDataSetChanged
刷新了选项卡名称

public void setTabNames(String[] input){
    names = Arrays.copyOf(input, input.length);
    notifyDataSetChanged()
}
PagerAdapter
javadoc:

如果支持此适配器的数据已更改,并且关联的视图应更新,则应用程序应调用此方法


我注意到,在适配器中,每次getItem()调用后都返回一个新片段。您应该在返回片段之前设置其标题

@Override
public Fragment getItem(int position) {
    switch (position){
        case 0:
            TabOne fragTab1 = new TabOne();
            fragTab1.setTitle(names[position]);
            return fragTab1;
        (...)
        default:
            return null;
    }
}

在设置选项卡名称后,您是否尝试过使视图无效?否,我该如何做尝试viewPager.invalidate();就在您的setCurrentItem调用之后,您的意思是在
public void onTabSelected(TabLayout.Tab)
方法中吗?是的,这应该会迫使android刷新/重画该viewPager…但是在我的
CustomTabAdapter
类中不是
names
。它不在实际的
TabsViewGUI
类中-因此我会像使用
CustomTabAdapter
中的get方法一样使用它。对不起,我不明白您的意思。适配器中的
names
变量不是保存页面标题的数组吗?适配器模式用于将数据集与呈现该数据集的ui代码解耦,可以是选项卡主机中的选项卡、表视图中的表行或其他任何内容。话虽如此,您的适配器应该保存呈现此页面所需的所有数据。对不起,忘记我刚才说的-是的,您是对的-它在adpter类中。显然,我找错了类,但出于兴趣,我仍然需要
invalidate()
-也就是
viewpager.invalidate()
?@CodeMan不,我想你可以忘记invalidate()调用:)我似乎找不到fragmentnotifyDataSetChanged()的
setTitle()
方法通常在渲染后向选项卡主体添加或删除选项卡时调用。