Android中Scrollview与ViewPager冲突问题解决方案

显示问题:

1、设置ScrollView的fillViewPort为true

2、设置ViewPager的layout_height为一个固定高度,比如:100dip

 

冲突问题:

不过ViewPager显示出来以后,还有另外一个冲突:ViewPager左右不能滑动了!是的,因为这个事件其实已经被外层的ScrollView截获!

重写ScrollView控件!

第一种解决方案:

重写ScrollView,然后嵌套使用无任何问题,如何重写,具体看以下地址

http://stackoverflow.com/questions/2646028/android-horizontalscrollview-within-scrollview-touch-handling

备注:ListView嵌套无法滑动也可以解决,listview布局推荐线性布局,相对布局有小问题,如何解决请google


第二种方案:viewpager结合下拉刷新组件,重写Viewpager组件,如何重写参考以下代码。

<span style="font-size:18px;">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;
	 }

}</span>




转载地址:http://blog.csdn.net/mcy478643968/article/details/19609407



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值