ViewPager的那些事

目錄:

一、禁止點擊tag時ViewPager滾動的過渡動畫。
二、解決adapter的notifyDataSetChanged()無效問題。
三、設置ViewPager的預加載頁數。
四、禁止ViewPager手勢左右切換的操做。
五、ViewPager左右滑動的慣性消失的bug。
六、ViewPager與子View進行通訊。java


一、禁止點擊tag時ViewPager滾動的過渡動畫:

當咱們的ViewPager綁定了TabLayout控件的時候,一般都有點擊一個tab實現切換ViewPager的功能,可是若是在切換時不想要那個切換動畫,該如何作? **解決方案:**其實很簡單,關鍵代碼就一句:緩存

//第二個參數就是禁止滾動過渡的效果
mViewPager.setCurrentItem(0, false);
複製代碼

二、解決adapter的notifyDataSetChanged()無效問題:

若是想實現ViewPager的數據更新,在調用adapter的notifyDateSetChanged()會發現並無效果,其實並不是沒有效果,日後滑動兩頁到第三頁會發現,除了ViewPager默認緩存的那三頁數據沒有刷新以外,後面的(第三頁以後)數據都是刷新了的,這時再返回第一頁會發現第一頁的數據也發生變化了。 **解決方案:**複寫adapter的getItemPosition方法,返回POSITION_NONE便可。ide

public int getItemPosition(Object object) {    
  return POSITION_NONE;
}
複製代碼

存在的問題:這不是PagerAdapter中的Bug,一般狀況下,調用notifyDataSetChanged方法會讓ViewPager經過Adapter的getItemPosition方法查詢一遍全部child view,這種狀況下,全部child view位置均爲POSITION_NONE,表示全部的child view都不存在,ViewPager會調用destroyItem方法銷燬,而且從新生成,加大系統開銷,並在一些複雜狀況下致使邏輯問題。特別是對於只是但願更新child view內容的時候,形成了徹底沒必要要的開銷。更有效地方法:更爲靠譜的方法是因地制宜,根據本身的需求來實現notifyDataSetChanged的功能,好比,在僅須要對某個View內容進行更新時,在instantiateItem()時,用View.setTag方法加入標誌,在須要更新信息時,經過findViewWithTag的方法找到對應的View進行更新便可。動畫


三、設置ViewPager的預加載頁數:

ViewPager默認會預加載左右兩頁的內容,若是想預加載更多,只需調用ViewPager的setOffscreenPageLimit()便可。this

mViewPager.setOffscreenPageLimit(2); // 設置緩存view 的個數(實際有3個,緩存2個+正在顯示的1個)
複製代碼

四、禁止ViewPager手勢左右切換的操做:

**解決方案:**自定義View繼承自ViewPager,代碼以下:spa

public class ViewPagerEx extends ViewPager{
    private boolean isPagingEnabled = true;

    public ViewPagerEx(Context context) {
        super(context);
    }
    public ViewPagerEx(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return this.isPagingEnabled && super.onInterceptTouchEvent(event);
    }

    public void setPagingEnabled(boolean canScroll) {
        this.isPagingEnabled = canScroll;
    }

    @Override
    public void setCurrentItem(int item, boolean smoothScroll) {
        super.setCurrentItem(item, smoothScroll);
    }
}
複製代碼

使用方法:code

mViewPager.setPagingEnabled(false);//禁止左右滑動
mViewPager.setPagingEnabled(true);//開啓左右滑動
複製代碼

五、ViewPager左右滑動的慣性消失的bug。

檢查下FragmentPagerAdapter的構造方法是否是傳了getFragmentManager()?若是是,改成getChildFragmentManager()便可,沒錯,就是這麼簡單。繼承


六、ViewPager與子View進行通訊。

好比我想在ViewPager每滑動結束後,通知子View並進行刷新。get

//利用Tag去獲取到對應的子View,而後對View進行操做。
 viewPager.findViewWithTag(position);
//在Adapter的instantiateItem方法中給子View設置Tag
view.setTag(position);
複製代碼

(不按期更新)it

相關文章
相關標籤/搜索