2016-08-07 4 views
0

Я хочу показать 3 разных вида в ViewPager, и я хочу перемещаться между ними с помощью нижней навигационной панели. Но у меня серьезная проблема с производительностью. Когда я попытался переключить представление, он переключается с лагги-салфеткой, и я думаю, что это потому, что каждый фрагмент восстанавливается каждый раз, когда я переключаюсь, или потому, что я не использовал метод onPageSelected. Я не мог это исправить.FragmentPagerAdapter в ViewPager

Вот мои коды. MainActivity.java

public class MainActivity extends FragmentActivity { 

private BottomBar mBottomBar; 
private User currentUser; 
private NonSwipeableViewPager viewPager; 
private Context context; 
private FragmentAdapter fragAdapter; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    context = this; 

    // To retrieve object in second Activity 
    currentUser = (User) getIntent().getSerializableExtra("currentUser"); 

    //initialize views 
    initView(); 

    //bottom bar 
    mBottomBar = BottomBar.attach(this, savedInstanceState); 
    mBottomBar.noTabletGoodness(); 
    //mBottomBar.setActiveTabColor(R.color.app_design_color); 
    mBottomBar.setItems(R.menu.bottombar_menu); 
    mBottomBar.setActiveTabColor("#6c4853"); 
    //mBottomBar.setBottom(1); 

    mBottomBar.setOnMenuTabClickListener(new OnMenuTabClickListener() { 
     @Override 
     public void onMenuTabSelected(@IdRes int menuItemId) { 
      if (menuItemId == R.id.bottomContacts) { 
       // The user selected item number one. 
       setPage(Constants.CONTACTS_NUM); 
      }else if (menuItemId == R.id.bottomQR) { 
       // The user selected item number two. 
       //setAdapterClick(Constants.ADD_NUM); 
      }else if (menuItemId == R.id.bottomProfile) { 
       // The user selected item number three. 
       setPage(Constants.PROFILE_NUM); 
      } 
     } 

     @Override 
     public void onMenuTabReSelected(@IdRes int menuItemId) { 

      if (menuItemId == R.id.bottomContacts) { 
       // The user selected item number one. 
      }else if (menuItemId == R.id.bottomQR) { 
       // The user selected item number one. 
      }else if (menuItemId == R.id.bottomProfile) { 
       // The user selected item number one. 
      } 
     } 
    }); 
} 

private void initView(){ 

    viewPager = (NonSwipeableViewPager) findViewById(R.id.viewpager); 
    fragAdapter = new FragmentAdapter(getSupportFragmentManager(), currentUser, context); 
    viewPager.setAdapter(fragAdapter); 

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
     } 

     @Override 
     public void onPageSelected(int position) { 
     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    // Necessary to restore the BottomBar's state, otherwise we would 
    // lose the current tab on orientation change. 
    mBottomBar.onSaveInstanceState(outState); 
} 

private void setPage(final int pageNum){ 
    viewPager.setCurrentItem(pageNum, true); 
    Global.setCurrentPageNum(pageNum); 
} 

private void setAdapterClick(int no){ 
    switch (no){ 
     case Constants.CONTACTS_NUM : 
      setPage(Constants.CONTACTS_NUM); 
      break; 
     case Constants.ADD_NUM : 
      setPage(Constants.ADD_NUM); 
      break; 
     case Constants.PROFILE_NUM : 
      setPage(Constants.PROFILE_NUM); 
      break; 
    } 
} 
} 

FragmentAdapter.java

public class FragmentAdapter extends FragmentPagerAdapter{ 

private Context context; 
private User currentUser; 
private FragmentManager fm; 


public FragmentAdapter(FragmentManager fm, User currentUser, Context context) { 
    super(fm); 
    this.fm = fm; 
    this.context = context; 
    this.currentUser = currentUser; 
} 

@Override 
public Fragment getItem(int position) { 
    switch (position){ 
     case 0 : 
      return new ContactsFragment().newInstance(context, currentUser); 
     case 1 : 
      return new ContactsFragment().newInstance(context, currentUser); 
     case 2 : 
      return new ProfileFragment().newInstance(context, currentUser); 
     default : 
      return new ContactsFragment().newInstance(context, currentUser); 
    } 
} 

@Override 
public int getCount() { 
    return 3; 
} 
} 

Один из моих фрагментов:

public class ContactsFragment extends Fragment{ 
// Store instance variables 
private Context context; 
private User currentUser; 
private View actionView; 
private View contactsView; 

// newInstance constructor for creating fragment with arguments 
public static ContactsFragment newInstance(Context context, User currentUser) { 
    ContactsFragment fragmentFirst = new ContactsFragment(); 
    Bundle args = new Bundle(); 
    args.putSerializable("currentUser", currentUser); 
    fragmentFirst.setArguments(args); 
    return fragmentFirst; 
} 

// Store instance variables based on arguments passed 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    this.context = getActivity(); 
    this.currentUser = (User) getArguments().getSerializable("currentUser"); 

} 

// Inflate the view for the fragment based on layout XML 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    if(contactsView == null){ 
     contactsView = inflater.inflate(R.layout.contacts_layout, container, false); 
     RecyclerView recyclerView = (RecyclerView) contactsView.findViewById(R.id.recycler_view); 
     LinearLayoutManager lLayout = new GridLayoutManager(context, 1); 
     recyclerView.addItemDecoration(new DividerItemDecoration(context, R.drawable.divider)); 
     recyclerView.setHasFixedSize(true); 
     recyclerView.setLayoutManager(lLayout); 
     recyclerView.setAdapter(new CategoryAdapter(context, currentUser.categories)); 
    } 
    return contactsView; 
} 
} 

Edit: Если отключить анимацию при установке текущего элемента, нет никаких проблем. Но я хочу использовать анимацию.

ответ

0

Попробуйте добавить эту строку после установки адаптера для ViewPager в initView()

viewPager.setOffScreenPageLimit(3); 

Следующий метод Уже вступил предоставленной класса ViewPager в Android

/** 
* Set the number of pages that should be retained to either side of the 
* current page in the view hierarchy in an idle state. Pages beyond this 
* limit will be recreated from the adapter when needed. 
* 
* <p>This is offered as an optimization. If you know in advance the number 
* of pages you will need to support or have lazy-loading mechanisms in place 
* on your pages, tweaking this setting can have benefits in perceived smoothness 
* of paging animations and interaction. If you have a small number of pages (3-4) 
* that you can keep active all at once, less time will be spent in layout for 
* newly created view subtrees as the user pages back and forth.</p> 
* 
* <p>You should keep this limit low, especially if your pages have complex layouts. 
* This setting defaults to 1.</p> 
* 
* @param limit How many pages will be kept offscreen in an idle state. 
*/ 
public void setOffscreenPageLimit(int limit) { 
    if (limit < DEFAULT_OFFSCREEN_PAGES) { 
     Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " + 
       DEFAULT_OFFSCREEN_PAGES); 
     limit = DEFAULT_OFFSCREEN_PAGES; 
    } 
    if (limit != mOffscreenPageLimit) { 
     mOffscreenPageLimit = limit; 
     populate(); 
    } 
} 

Еще одна вещь, которую я заметил, внутри вашего кода является то, что вы используете getIntentSearializableExtra() cuz вы используете Serializable для переноса данных внутри вашей деятельности, а также в Фрагменте.

Пожалуйста, не делайте этого попробуйте использовать Сериализуемый Используйте Parcelable и getParcelableExtra()

Пожалуйста, обратите внимание эту ссылку http://www.3pillarglobal.com/insights/parcelable-vs-java-serialization-in-android-app-development

Вот почему я предлагаю вам использовать Parcelable.

+0

Thans для вашего ответа, но это не сработало. Между фрагментами все еще есть лагги. –

+0

@EmreAlparslan вы попробовали это с 2 или 3, я поспешно написал 2, но вы используете 3 фрагмента, поэтому попробуйте с помощью 3 –

Смежные вопросы