我们知道tablayout+viewpager要想动态刷新标题可以通过先设置值然后notifyDataSetChanged()来实现,这样会调getPageTitle()来获取标题,相这样
public CharSequence getPageTitle(int position) {
String title;
if(position==0)
title = normalTitle + "(" + normal + ")";
else {
title = errorTitle + "(" + error + ")";
}
return title;
}
但是,原生的title样式太单调满足不了需求,所以我们可以通过tablayout来预先设置
tabLayout.getTabAt(0).setCustomView(normalView);
看样子是可以了,但是怎么刷新呢?setCustomView()我们通常再activity中进行,还有frament的数据,很多人都是重新setframent()来替换,然后fragmentManager.executePendingTransactions(),但是这样并不是一个好办法,为了可以notifyDataSetChanged()后就刷新,我是这样进行的。在强制刷新后会运行到getItemPosition(),这里的object其实就是fragment,于是在fragment中提供update()方案就好
@Override
public int getItemPosition(Object object) {
if (object instanceof CheckNormalFragment) {
((CheckNormalFragment) object).upDate(normalData);
}else if (object instanceof CheckErrorFragment) {
((CheckErrorFragment) object).upDate(errorData);
}
return super.getItemPosition(object);
}
但是调用notifyDataSetChanged()后会重新调用getPageTitle(),如果是自定义title有没复写这个方案就会没有标题。那我们在把tablayout对象和自定义view闯入adaptr中,在notify后重新设置,正好title也可以是动态的。
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
tabLayout.getTabAt(0).setCustomView(normalView);
tabLayout.getTabAt(1).setCustomView(errorView);
setText(normalView,normal);
setText(errorView,error);
}
可以这样我们的adapter需要的参数就多了,特别是多title多不同view的时候,以下是两个view在activity设置后传入adapter
adapter = new ViewPagerAdapter(getSupportFragmentManager(),mHandler,view1,view2,tabLayout);
viewPager.setAdapter(adapter);
tabLayout.setupWithViewPager(viewPager);
tabLayout.addOnTabSelectedListener(this);
tabLayout.getTabAt(0).setCustomView(view1);
tabLayout.getTabAt(1).setCustomView(view2);
那么我们想如果可以在pagerAdapter中获得tablayout就像上面获得frament一样就好了,尝试后我发现其实是可以的,在很多方法中都有一个viewgroup对象,这个对象其实就是ViewPager,那么我们在布局中ViewPager的上一个视图就是tablayout。
@Override
public Object instantiateItem(ViewGroup container, int position) {
if(tabLayout ==null){
ViewGroup paretnt = (ViewGroup) container.getParent();
View tab = paretnt.getChildAt(0);
tabLayout = (TabLayout)tab;
tabLayout.getTabAt(0).setCustomView(normalView);
tabLayout.getTabAt(1).setCustomView(errorView);
setText(normalView,normal);
setText(errorView,error);
}
return super.instantiateItem(container, position);
}
这样一来在activity的第一次初始化都完成了,下面只需要在notify后再设置一次。
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
tabLayout.getTabAt(0).setCustomView(normalView);
tabLayout.getTabAt(1).setCustomView(errorView);
setText(normalView,normal);
setText(errorView,error);
}
这里的setText是我用来设置自定义title里动态红色数字的
public void setText (View view, int number) {
TextView tabTitle = (TextView) view.findViewById(R.id.text_title);
tabTitle.setText(number+"");
}
最后只需要再activity中调用adddate就可以了,标题的数量和fragment的具体参数都刷新
public void addDate(GoodInfoResult result){
normalData.addAll(data);
errorData.addAll(eData);
notifyDataSetChanged();
}