现在的位置: 首页 > 综合 > 正文

listview中嵌套viewpager的实现总结

2013年03月22日 ⁄ 综合 ⁄ 共 1766字 ⁄ 字号 评论关闭

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

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

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

2.viewPager与listView的滑动冲突

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

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

    @Override
    public int getViewTypeCount() {
		return 2;
	}
	
    @Override
    public int getItemViewType(int position) { 
		return position > 0 ? 0 : 1;
	}

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

(1)重写listView

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

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 :viewPager的的简单demo,有不清楚的可以留言。

抱歉!评论已关闭.