ViewPager

FragmentPagerAdapter 与 FragmentStatePagerAdapter

  • 问题描述: 最近做一个项目,要根据搜索的结果显示一个ViewPager,ViewPager的每一个页面都是fragment,原先 用的FragmentPagerAdapter, 数据发生变化后,调用notifydatasetchanged没用,fragment没有重建

  • 解决思路: FragmentPagerAdapter更多的用于少量界面的ViewPager。划过的fragment会保存在内存中,尽管已经划过。而FragmentStatePagerAdapter和ListView有点类似,会保存当前界面,以及下一个界面和上一个界面(如果有),最多保存3个,其他会被销毁掉。如果fragment的数据源发生了变化,而且需要重新构建fragment的时候,应当采用FragmentStatePagerAdapter, 这时候调用adapter的notifydatasetchanged才会有效果

ViewPager的数据请求问题

  • 问题描述: 有时ViewPager的每一个页面都有数据请求,正确做法应当是只有切换到了该页面,才会去请求数据,而不是在每一个页面创建的时候就请求数据了。

  • 解决思路: 做法是为ViewPager设置OnPageChangeListener,只有选择了那个页面,才会请求数据,并且只请求一次

    viewpager的OnPageChangeListener
    
    @Override
     public void onPageSelected(int position) {
         BaseFragment fragment = mFragmentList.get(position);
         fragment.startRequest();
     }
    
     ...........
    
     具体的fragment,并且在请求成功后,将boolean设为true
    
     public void startRequest() {
          if(!mIsRequested) {
              getList();
          }
      }
    

ViewPager的滑动问题

  • 问题描述: im录音的一个界面,parent是一个ViewPager,在界面按下按钮录音,这个时候应当让ViewPager不能够左右滑动。

  • 解决思路: ViewPager在滑动时会拦截触摸事件,所以只要可以设定ViewPager什么时候拦截,什么时候不拦截触摸事件就行

    public class KasViewPager extends ViewPager {
      //if true, keep View don't move
      private boolean mNoFocus = false;
    
      public KasViewPager(Context context) {
          this(context, null);
      }
    
      public KasViewPager(Context context, AttributeSet attrs) {
          super(context, attrs);
      }
    
      @Override
      public boolean onInterceptTouchEvent(MotionEvent event) {
        if (mNoFocus) {
          return false;
        }
        return super.onInterceptTouchEvent(event);
      }
    
      public void setNoFocus(boolean b) {
          mNoFocus = b;
      }
    }
    

results matching ""

    No results matching ""