ScrollView中嵌套ListView,GridView

来源:互联网 发布:产品摄影 知乎 编辑:程序博客网 时间:2024/05/17 03:18

一、在ScrollView中添加一属性 android:fillViewport=”true” 。

二、指定ListView的高度 android:layout_height=”XXXdip” ;

三、通过方法计算高度 setLayoutParams(params);

private void setListViewHeight(ListView listView) {//获取ListView对应的AdapterListAdapter listAdapter = listView.getAdapter();if (listAdapter == null) {return;}int totalHeight = 0;for (int i = 0, len = listAdapter.getCount(); i < len; i++) { //listAdapter.getCount()返回数据项的数目View listItem = listAdapter.getView(i, null, listView);listItem.measure(0, 0); //计算子项View 的宽高totalHeight += listItem.getMeasuredHeight(); //统计所有子项的总高度}ViewGroup.LayoutParams params = listView.getLayoutParams();params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));//listView.getDividerHeight()获取子项间分隔符占用的高度//params.height最后得到整个ListView完整显示需要的高度listView.setLayoutParams(params);}

四、重写ListView,GridView

public class TestListView extends ListView{      public TestListView(Context context) {         super(context);         // TODO Auto-generated constructor stub     }     public TestListView(Context context, AttributeSet attrs) {         super(context, attrs);         // TODO Auto-generated constructor stub     }     public TestListView(Context context, AttributeSet attrs, int defStyle) {         super(context, attrs, defStyle);         // TODO Auto-generated constructor stub     }     @Override     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {         // TODO Auto-generated method stub         int expandSpec = MeasureSpec.makeMeasureSpec(                  Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);                   super.onMeasure(widthMeasureSpec, expandSpec);     }  } 

public class MyGridView extends GridView{      public MyGridView(Context context, AttributeSet attrs, int defStyle) {         super(context, attrs, defStyle);         // TODO Auto-generated constructor stub     }     public MyGridView(Context context, AttributeSet attrs) {         super(context, attrs);         // TODO Auto-generated constructor stub     }     public MyGridView(Context context) {         super(context);         // TODO Auto-generated constructor stub     }     @Override     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {         // TODO Auto-generated method stub         int expandSpec = MeasureSpec.makeMeasureSpec(                  Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);          super.onMeasure(widthMeasureSpec, expandSpec);       } } 

五、 解决scroolview与viewpager冲突

1.自定义scrollview

/**  * 能够兼容ViewPager的ScrollView  * @Description: 解决了ViewPager在ScrollView中的滑动反弹问题   * @File: ScrollViewExtend.java   * @Package com.image.indicator.control   * @Author Hanyonglu   * @Date 2012-6-18 下午01:34:50   * @Version V1.0  */  public class ScrollViewExtend extends ScrollView {      // 滑动距离及坐标      private float xDistance, yDistance, xLast, yLast;        public ScrollViewExtend(Context context, AttributeSet attrs) {          super(context, attrs);      }        @Override      public boolean onInterceptTouchEvent(MotionEvent ev) {          switch (ev.getAction()) {              case MotionEvent.ACTION_DOWN:                  xDistance = yDistance = 0f;                  xLast = ev.getX();                  yLast = ev.getY();                  break;              case MotionEvent.ACTION_MOVE:                  final float curX = ev.getX();                  final float curY = ev.getY();                    xDistance += Math.abs(curX - xLast);                  yDistance += Math.abs(curY - yLast);                  xLast = curX;                  yLast = curY;                    if(xDistance > yDistance){                      return false;                  }            }            return super.onInterceptTouchEvent(ev);      }  }  
2.自定义viewpager

public class ChildViewPager extends ViewPager{      /** 触摸时按下的点 **/      PointF downP = new PointF();      /** 触摸时当前的点 **/      PointF curP = new PointF();       OnSingleTouchListener onSingleTouchListener;        public ChildViewPager(Context context, AttributeSet attrs) {          super(context, attrs);          // TODO Auto-generated constructor stub      }        public ChildViewPager(Context context) {          super(context);          // TODO Auto-generated constructor stub      }        @Override      public boolean onInterceptTouchEvent(MotionEvent arg0) {          // TODO Auto-generated method stub          //当拦截触摸事件到达此位置的时候,返回true,          //说明将onTouch拦截在此控件,进而执行此控件的onTouchEvent          return true;      }        @Override      public boolean onTouchEvent(MotionEvent arg0) {          // TODO Auto-generated method stub          //每次进行onTouch事件都记录当前的按下的坐标          curP.x = arg0.getX();          curP.y = arg0.getY();            if(arg0.getAction() == MotionEvent.ACTION_DOWN){              //记录按下时候的坐标              //切记不可用 downP = curP ,这样在改变curP的时候,downP也会改变              downP.x = arg0.getX();              downP.y = arg0.getY();              //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰              getParent().requestDisallowInterceptTouchEvent(true);          }            if(arg0.getAction() == MotionEvent.ACTION_MOVE){              //此句代码是为了通知他的父ViewPager现在进行的是本控件的操作,不要对我的操作进行干扰              getParent().requestDisallowInterceptTouchEvent(true);          }            if(arg0.getAction() == MotionEvent.ACTION_UP){              //在up时判断是否按下和松手的坐标为一个点              //如果是一个点,将执行点击事件,这是我自己写的点击事件,而不是onclick              if(downP.x==curP.x && downP.y==curP.y){                  onSingleTouch();                  return true;              }          }            return super.onTouchEvent(arg0);      }            /**      * 单击      */      public void onSingleTouch() {          if (onSingleTouchListener!= null) {                onSingleTouchListener.onSingleTouch();          }      }        /**      * 创建点击事件接口      * @author wanpg      *      */      public interface OnSingleTouchListener {          public void onSingleTouch();      }        public void setOnSingleTouchListener(OnSingleTouchListener onSingleTouchListener) {          this.onSingleTouchListener = onSingleTouchListener;      }    }



0 0
原创粉丝点击