listview中嵌套viewpager的實現總結

最近在做一個項目需要在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下載地址:http://download.csdn.net/detail/zglslyg/7270961

 有不清楚的可以留言。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章