listview中嵌套viewpager的实现总结

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



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

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

2.viewPager与listView的滑动冲突

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


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

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.   @Override  
  2.   public int getViewTypeCount() {  
  3. return 2;  
  4.   
  5.   
  6.   @Override  
  7.   public int getItemViewType(int position) {   
  8. return position > 0 ? 0 : 1;  

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

(1)重写listView

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class MyListView extends ListView {  
  2.     private GestureDetector mGestureDetector;  
  3.         View.OnTouchListener mGestureListener;  
  4.     public MyListView(Context context) {  
  5.       super(context);  
  6.     }  
  7.     public MyListView(Context context, AttributeSet attrs) {  
  8.       super(context, attrs);  
  9.       mGestureDetector = new GestureDetector(new YScrollDetector());  
  10.       setFadingEdgeLength(0);  
  11.     }  
  12.     public MyListView(Context context, AttributeSet attrs, int defStyle) {  
  13.       super(context, attrs, defStyle);  
  14.     }  
  15.     @Override  
  16.     public boolean onInterceptTouchEvent(MotionEvent ev) {  
  17.       return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev);  
  18.     }  
  19.     class YScrollDetector extends SimpleOnGestureListener {  
  20.             @Override  
  21.             public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {  
  22.        if(distanceY!=0&&distanceX!=0){  
  23.                  
  24.        }  
  25.                 if(Math.abs(distanceY) >= Math.abs(distanceX)) {  
  26.                     return true;  
  27.                 }  
  28.                 return false;  
  29.             }  
  30.     }  
  31.     }  

(2)重写ViewPager

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class MyViewPager extends ViewPager {  
  2.   
  3.     public MyViewPager(Context context) {  
  4.         super(context);  
  5.     }  
  6.       
  7.     public MyViewPager(Context context, AttributeSet attrs) {  
  8.         super(context, attrs);  
  9.     }  
  10.   
  11.     @Override  
  12.     public boolean dispatchTouchEvent(MotionEvent ev) {  
  13.         getParent().requestDisallowInterceptTouchEvent(true);//这句话的作用 告诉父view,我的单击事件我自行处理,不要阻碍我。    
  14.         return super.dispatchTouchEvent(ev);  
  15.     }  
  16. }  
上面两种方法可以解决listView和ViewPager的滑动问题,注意需要固定ViewPager的高度,才能在listView中完整的显示出来。


针对问题3

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


转自:http://blog.csdn.net/zglslyg/article/details/8480460

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值