android:TabHost和ViewPage多頁滑動的使用
要實現的一個簡單的功能:
大致說下:
TabHost中自定的每個可以點擊的地區,可以設定為點擊切換Tab,兩次點擊同一個Tab,重新整理當前tab,那麼ViewPage也可以那樣的,但是有個第三方的viewpagerindicator,項目裡直接用這個;
文字描述:
在ViewPage中的三個Fragment之間滑動的時候不重新整理每個Fragment的內容,在點擊ViewPage上面的Indicate時重新整理每個Fragment;
簡單實現的一些想法:
TabHost比較簡單,點擊tab1時,如果當前顯示tab1,則重新整理,否則切換tab
tabHost.addTab(tabHost.newTabSpec(tab+i).setIndicator(tabView[i]) .setContent(tabContent[i])); tabView[i].setTag(i); tabView[i].setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int tabId=Integer.parseInt(v.getTag().toString()); if(tabId==tabHost.getCurrentTab()){ reloadByTabId(tabId); }else { tabHost.setCurrentTab(tabId); changeTabCotent(tabId); } } });
ViewPage也可以像TabHost一樣,不過用了第三方的,那麼就重新換個思路;
CONTENT =new String[]{}; FRAMES = new Fragment[]{}; initIndicator(,CONTENT,FRAMES); adapter = new ViewPageAdapter(getSupportFragmentManager()); mViewPage = (MyViewPager)findViewById(R.id.pager); mViewPage.setAdapter(adapter); mViewPage.setOffscreenPageLimit(0); TabPageIndicator indicator =(TabPageIndicator)findViewById(R.id.indicator); indicator.setViewPager(mViewPage, selectIndex); indicator.setOnPageChangeListener(new ViewPageListener());
有的說viewPage中超出一定數量的Fragment切換回來後介面變白了,也不清楚是什麼原因,那麼在ViewPage中攔截destroyItem():
class ViewPageAdapter extends FragmentPagerAdapter { public ViewPageAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return FRAMES[position % CONTENT.length]; } @Override public int getItemPosition(Object object) { return super.getItemPosition(object); } @Override public CharSequence getPageTitle(int position) { return CONTENT[position % CONTENT.length]; } @Override public int getCount() { return CONTENT.length; } @Override public void destroyItem(View container, int position, Object object) { } @Override public void destroyItem(ViewGroup container, int position, Object object) { } }
ViewPageListener.class關鍵是這裡,viewpage初始化選中事件有時候會在介面初始化完成之前不清楚是哪裡的問題,所以調用onViewPageSelection()時注意當前頁面已初始化完畢;
class ViewPageListener implements OnPageChangeListener { private int offset = 0; @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { offset = arg2; if(isInit&&arg1==0&&arg2==0){ onPageSelected(arg0); isInit = false; } } @Override public void onPageSelected(int arg0) { if(adapter!=null){ Fragment fragment = adapter.getItem(arg0); if(fragment instanceof MyBaseFragment){ MyBaseFragment myFragment = (MyBaseFragment)fragment; myFragment.onViewPageSelection(arg0,offset); } } } }
在單個Fragment中擷取Viewpager事件通知:
@Override public void onViewPageSelection(int index,int offset) { super.onViewPageSelection(index,offset); selectedIndex = index; setPositon(index); if(!hasLoadOk.containsKey(index)||hasLoadOk.get(index)==false){ isShowProgress = false; startLocation(true,false); }else if(offset==0){ isShowProgress = true; loadData(true); } }