您的位置:首页 > 其它

listView中嵌套viewPager作为headerview

2016-05-07 17:54 489 查看
转载于:http://blog.csdn.net/zglslyg/article/details/8480460

最近在做一个项目需要在listView中嵌套viewPager作为第一项,效果如下:



上面的布局就是一个listView,在实现过程中遇到了以下问题:

1.listView中第一项为viewPager,其他项为单独包含两种数据类型,导致listView布局混乱。

2.viewPager与listView的滑动冲突

3.viewPager的监听器在viewPager切换的时候,进入了onPageChang方法但界面上没有显示相应的页码刷新。

针对问题1,查资料后发现当listView中的item类型超过一项时,需要重载方法

[java] view
plain copy

 





  @Override  

  public int getViewTypeCount() {  

return 2;  

  

  

  @Override  

  public int getItemViewType(int position) {   

return position > 0 ? 0 : 1;  

针对问题2,上网搜索后发现了两种解决办法:

(1)重写listView

[java] view
plain copy

 





public class MyListView extends ListView {  

    private GestureDetector mGestureDetector;  

        View.OnTouchListener mGestureListener;  

    public MyListView(Context context) {  

      super(context);  

    }  

    public MyListView(Context context, AttributeSet attrs) {  

      super(context, attrs);  

      mGestureDetector = new GestureDetector(new YScrollDetector());  

      setFadingEdgeLength(0);  

    }  

    public MyListView(Context context, AttributeSet attrs, int defStyle) {  

      super(context, attrs, defStyle);  

    }  

    @Override  

    public boolean onInterceptTouchEvent(MotionEvent ev) {  

      return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);  

    }  

    class YScrollDetector extends SimpleOnGestureListener {  

            @Override  

            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {  

       if(distanceY!=0&&distanceX!=0){  

                 

       }  

                if(Math.abs(distanceY) >= Math.abs(distanceX)) {  

                    return true;  

                }  

                return false;  

            }  

    }  

    }  

(2)重写ViewPager

[java] view
plain copy

 





public class MyViewPager extends ViewPager {  

  

    public MyViewPager(Context context) {  

        super(context);  

    }  

      

    public MyViewPager(Context context, AttributeSet attrs) {  

        super(context, attrs);  

    }  

  

    @Override  

    public boolean dispatchTouchEvent(MotionEvent ev) {  

        getParent().requestDisallowInterceptTouchEvent(true);//这句话的作用 告诉父view,我的单击事件我自行处理,不要阻碍我。    

        return super.dispatchTouchEvent(ev);  

    }  

}  

上面两种方法可以解决listView和ViewPager的滑动问题,注意需要固定ViewPager的高度,才能在listView中完整的显示出来。

针对问题3

发现我把viewPager的监听器写在了listView的getView中,导致多次加载监听器,出现监听器不管用的问题。把OnPageChangeListener监听器放在初始化的时候就可以正常刷新了。

demo下载地址:http://download.csdn.net/detail/zglslyg/7270961

 有不清楚的可以留言。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: