自定义的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 : 在这种模式下,尺寸的值是多少,这个组件的长宽就是多少;
(2) 最大模式 MeasureSpec.AT_MOST : 在这种模式下,组件的长款最大只能有父容器那么大,比父容器小当然也是可以的啦
(3) 未指定模式 MeasureSpec.UNSPECIFIED : 在这种模式下,组件可随意的使用空间,不受任何限制
那么一个int型的整数怎么表示两样东西呢? 那是因为他是两位2进制,系统采用了最高的两位表示模式,就像这样:
![](https://img-blog.csdn.net/20160930172919964?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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>
在使用过程中listView嵌套ListView ,外层ListView用原生的LIstView ,里面的才用自定义的..
小菜鸟学习ing......
(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......
相关文章推荐
- 解决ListView与ScrollView的滑动冲突(非自定义View方案)
- Android中自定义ListView,解决scrollview嵌套listview 滑动事件冲突
- 解决ScrollView和GridListView和ListView滑动冲突方法(二)自定义ListView和GridView
- ScrollView嵌套ListView——解决滑动冲突问题
- 解决水平ListView在ScrollView中出现的滑动冲突
- 解决ScrollView嵌套viewPager中嵌套listView滑动事件冲突问题(水平方向)
- 实现水平ListView,并且解决水平ListView在ScrollView中Listview中出现的滑动冲突
- 上滑动改变头部,仿支付宝头部变化,解决ScrollView与listView冲突问题
- 解决ScrollView 与 ListView 的滑动冲突
- scrollView里面嵌套listview,导致滑动事件冲突解决。
- 解决ListView与ScrollView的滑动冲突
- 【Android界面实现】解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题
- 完美解决listView和ScrollView滑动冲突的问题
- Android ScrollView中嵌套ListView,滑动冲突问题的解决
- 解决ScrollView中嵌套Listview,Listview显示不完整和滑动冲突的问题
- Android ScrollView和ListView滑动冲突解决记录
- android 自定义ScrollView实现反弹效果(以及解决和ListView之间的冲突)
- 关于自定义listview,整合下拉刷新上拉加载功能,以及item侧滑功能,并且解决滑动冲突
- 解决ScrollView中嵌套Listview,Listview中嵌套Listview显示不完整和滑动冲突的问题
- Scrollview 嵌套listView 与recycleView 滑动冲突的解决