1. 程式人生 > >Android中Scrollview、ViewPager衝突問題彙總(已解決)

Android中Scrollview、ViewPager衝突問題彙總(已解決)

顯示問題:

1、設定ScrollView的fillViewPort為true

2、設定ViewPager的layout_height為一個固定高度,比如:100dip

衝突問題:

不過ViewPager顯示出來以後,還有另外一個衝突:ViewPager左右不能滑動了!是的,因為這個事件其實已經被外層的ScrollView截獲!

重寫ScrollView控制元件!

第一種解決方案:

重寫ScrollView,然後巢狀使用無任何問題,如何重寫,具體看以下地址

備註:ListView巢狀無法滑動也可以解決,listview佈局推薦線性佈局,相對佈局有小問題,如何解決請google

第二種方案:viewpager結合下拉重新整理元件,重寫Viewpager元件,如何重寫參考以下程式碼,

package com.bavariama.base.widget;

import java.net.ContentHandler;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;

/**
 * 此ViewPager解決與父容器ScrollView衝突的問題,無法完美解決.有卡頓
 * 此自定義元件和下拉重新整理scrollview配合暫時小完美,有待改善
 * @author bavariama
 * 
 */

public class InsideViewPager extends ViewPager {
	 float curX = 0f;
	 float downX = 0f;
	 OnSingleTouchListener onSingleTouchListener;
	
	 public InsideViewPager(Context context) {
	 // TODO Auto-generated constructor stub
	 super(context);
	 }
	
	 public InsideViewPager(Context context, AttributeSet attrs) {
	 // TODO Auto-generated constructor stub
	 super(context, attrs);
	 }
	
	 @Override
	 public boolean onTouchEvent(MotionEvent ev) {
	 curX = ev.getX();
	 // TODO Auto-generated method stub
	 if (ev.getAction() == MotionEvent.ACTION_DOWN) {
	 downX = curX;
	 }
	 int curIndex = getCurrentItem();
	 if (curIndex == 0) {
	 if (downX <= curX) {
	 getParent().requestDisallowInterceptTouchEvent(false);
	 } else {
	 getParent().requestDisallowInterceptTouchEvent(true);
	 }
	 } else if (curIndex == getAdapter().getCount() - 1) {
	 if (downX >= curX) {
	 getParent().requestDisallowInterceptTouchEvent(false);
	 } else {
	 getParent().requestDisallowInterceptTouchEvent(true);
	 }
	 } else {
	 getParent().requestDisallowInterceptTouchEvent(true);
	 }
	
	 return super.onTouchEvent(ev);
	 }
	
	 public void onSingleTouch() {
	 if (onSingleTouchListener != null) {
	 onSingleTouchListener.onSingleTouch();
	 }
	 }
	
	 public interface OnSingleTouchListener {
	 public void onSingleTouch();
	 }
	
	 public void setOnSingleTouchListner(
	 OnSingleTouchListener onSingleTouchListener) {
	 this.onSingleTouchListener = onSingleTouchListener;
	 }

}