notifyDataSetChanged方法从选项卡中轻松滚动

时间:2015-12-30 23:17:34

标签: android material-design

我目前正在使用我正在制作的Android应用中使用Material Design。在这个应用程序中,我使用Material Design选项卡布局来显示我收到的一些信息。但是,当我点击标签时,动画不顺畅,而且非常突然。滑动去另一个标签,但非常顺利。

    mTabLayout = (TabLayout) findViewById(R.id.chem_tab_layout);
    mGenericAdapter = new GenericPagerAdapter(getSupportFragmentManager());
    mPager = (ViewPager) findViewById(R.id.view_pager);
    mPager.setAdapter(mGenericAdapter);

    //Notice how the Tab Layout links with the Pager Adapter
    mTabLayout.setTabsFromPagerAdapter(mGenericAdapter);

    //Notice how The Tab Layout and View Pager object are linked
    mTabLayout.setupWithViewPager(mPager);
    mPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout){

        @Override
        public void onPageSelected(int position) {
            mGenericAdapter.notifyDataSetChanged();
        }

    });

这是我设置适配器的代码等。

这是我的标签的自定义适配器代码:

class GenericPagerAdapter extends FragmentStatePagerAdapter {

public GenericPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    ChemGridActivity.MyFragment myFragment = new ChemGridActivity.MyFragment();
    return myFragment;
}

@Override
public int getCount() {
    return 3; //returns number of tabs that need to be created
}

@Override
public CharSequence getPageTitle(int position) {

    if (position == 0) return "Chemistry";
    if (position == 1) return "Mathematics";
    if (position == 2) return "Physics";

    else return null;
}

@Override    
public int getItemPosition(Object object) {
    return POSITION_NONE;
}

我觉得当我添加onPageSelected时,标签之间的不稳定转换是由覆盖方法onPageChangeListener方法引起的。我应该在此方法中添加哪些内容,以便在标签上点击更平滑的动画?

1 个答案:

答案 0 :(得分:0)

在不了解课程内部的情况下,我想问题不是你有一个听众,而是你在听众中做了什么

对于大多数适配器notifyDataSetChanged(),将导致它再次重新渲染整个视图(包括所有页面)。

看到你没有说明通知的意图是什么,很难告诉你如何以另一种方式做到这一点,但如果你想让动画留下来你确实需要做一些不太强烈的事情光滑。

我怀疑你只想更改显示的片段,在这种情况下,只需在必要时使用FragmentManager,记住重复使用曾经见过的片段。

编辑根据评论中的其他信息

@Override
public Fragment getItem(int position) {
    //POSITION_SOMETHINHG would be one of a set of constants to indicate hwa to display
    return ChemGridActivity.MyFragment.newInstance(ChemGridActivity.MyFragment.POSITION_SOMETHINHG);
}

public class ChemGridActivity.MyFragment ... {

    private static final String KEY_DISPLAY_TYPE = "KEY_DISPLAY_TYPE";

    public static final int POSITION_SOMETHINHG = 11111;

    public static MyFragment newInstance(int display) {
        MyFragment f = new MyFragment();
        Bundle bund = new Bundle();
        bund.putInt(KEY_DISPLAY_TYPE, display);
        f.setArguments(bund);
        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle args = getArguments();
        if (args != null) {
            mDisplay = args.getInt(KEY_DISPLAY_TYPE, 0);
        }
    }

    @Override
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.my_layout, container, false);
        //TODO: change something based on mDisplay 
        return view;
    }