我目前正在使用我正在制作的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
方法引起的。我应该在此方法中添加哪些内容,以便在标签上点击更平滑的动画?
答案 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;
}