viewpager+fragment+tablayout自定义标题的刷新及fragemnt内容刷新方案

我们知道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();
    }

 

你可能感兴趣的:(安卓)