您的位置:首页 > 其它

自定义的ListView 解决与ScrollView的滑动冲突

2016-09-30 17:02 295 查看
代码如下

(1)ListView

public class CustomListView extends ListView {
public CustomListView(Context context) {
super(context);
}

public CustomListView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public CustomListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}

(2)GridView
public class CustomGridView extends GridView {
public CustomGridView(Context context) {
super(context);
}

public CustomGridView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public CustomGridView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
//
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_MOVE) {
return true;
}
return super.dispatchTouchEvent(ev);
}
}

重点来了(敲小黑板!)
int类型的MeasureSpec表示一个组件的大小,这个变量里面不仅有组建的尺寸大小,还有大小的模式

组件大小的模式有三种:

(1) 精确模式 MeasureSpec.EXACTLY : 在这种模式下,尺寸的值是多少,这个组件的长宽就是多少;

public static final int EXACTLY     = 1 << MODE_SHIFT;


(2) 最大模式 MeasureSpec.AT_MOST : 在这种模式下,组件的长款最大只能有父容器那么大,比父容器小当然也是可以的啦

public static final int AT_MOST     = 2 << MODE_SHIFT;


(3) 未指定模式 MeasureSpec.UNSPECIFIED : 在这种模式下,组件可随意的使用空间,不受任何限制

public static final int UNSPECIFIED = 0 << MODE_SHIFT;


那么一个int型的整数怎么表示两样东西呢? 那是因为他是两位2进制,系统采用了最高的两位表示模式,就像这样:



00 --> 0

01 -->1

11 -->2

为了操作简单,系统提供了MeasureSpec工具类,有四个方法和三个常量

public static int makeMeasureSpec(int size,int mode)//这里的mode传三个模式中的一种
//,size是我们给出的尺寸大小 为什么是Integer.MAX_VALUE >> 2? 百度说应该是边界高值<img alt="快哭了" src="http://static.blog.csdn.net/xheditor/xheditor_emot/default/fastcry.gif" />为什么我还是不懂,求大神指<span style="font-family:宋体;">导

</span><pre name="code" class="java">public static int getMode(int measureSpec)//<span style="font-family:宋体;">得到变量中的模式信息,得到的值可与三个常量进行比较
</span>
public static int getSize(int measureSpec)<span style="font-family:宋体;">;//得到变量中表示尺寸大小的值</span>

public static int toString<span style="font-family:宋体;">(int measureSpec);//把变量里面的模式和大小组成字符串返回来;</span>



在使用过程中listView嵌套ListView ,外层ListView用原生的LIstView ,里面的才用自定义的..

小菜鸟学习ing......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐