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()
方法通常在渲染后向选项卡主体添加或删除选项卡时调用。