Android 设置ListView不可滚动 及在ScrollView中不可滚动的设置
http://m.blog.csdn.net/blog/yusewuhen/43706169
转载请注明出处:
http://blog.csdn.net/androiddevelop/article/details/38815493
希望得到的效果是ListView不能滚动,但是最大的问题在与ListView Item还必有点击事件,如果不需要点击事件那就简单了,直接设置ListView.setEnable(false);
如果还需要点击事件,滚动与点击都是在ListView Touch处理机制管理。
ListView点击事件是复用ViewGroup的处理逻辑,当用户点击视图并且按下与抬起手指之间移动距离很小,满足点击事件的时间长度限制,就会触发点击事件。
ListView滚动事件是自己处理,有两个判断条件,当用户触发move事件并且滑动超过touch slop距离 或者 滑动速度超过阀值都会判定为滚动事件。
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ListView; public class ScrollDisabledListView extends ListView { private int mPosition; public ScrollDisabledListView(Context context) {
super(context);
} public ScrollDisabledListView(Context context, AttributeSet attrs) {
super(context, attrs);
} public ScrollDisabledListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
} @Override
public boolean dispatchTouchEvent(MotionEvent ev) {
final int actionMasked = ev.getActionMasked() & MotionEvent.ACTION_MASK; if (actionMasked == MotionEvent.ACTION_DOWN) {
// 记录手指按下时的位置
mPosition = pointToPosition((int) ev.getX(), (int) ev.getY());
return super.dispatchTouchEvent(ev);
} if (actionMasked == MotionEvent.ACTION_MOVE) {
// 最关键的地方,忽略MOVE 事件
// ListView onTouch获取不到MOVE事件所以不会发生滚动处理
return true;
} // 手指抬起时
if (actionMasked == MotionEvent.ACTION_UP
|| actionMasked == MotionEvent.ACTION_CANCEL) {
// 手指按下与抬起都在同一个视图内,交给父控件处理,这是一个点击事件
if (pointToPosition((int) ev.getX(), (int) ev.getY()) == mPosition) {
super.dispatchTouchEvent(ev);
} else {
// 如果手指已经移出按下时的Item,说明是滚动行为,清理Item pressed状态
setPressed(false);
invalidate();
return true;
}
} return super.dispatchTouchEvent(ev);
}
}
此方法使用与listview 不在ScrollView中,当我把listview放到ScrollView中使用 该方法时,发现是不能够正常使用的,此类问题的解决方法请往下看
Android中ScrollView中嵌套ListView解决listview滚动问题
这
几天项目需要在ScrollView中放入ListView,一开始还以为很轻松的,就是一个xml的布局问题。但是实际操作才发现问题,会发现
ListView会显示不完全,它的高度始终有问题。网上同样有很多人遇到这样的问题,大多数人不推荐这样的设计,因为默认情况下Android是禁止在
ScrollView中放入另外的ScrollView的,它的高度是无法计算的。
但
是既然已经有这样的需求,就要实现。StackOverFlow真是个好东西,发现已经有牛人解决了这个问题,经过试验是可以解决这个问题的,它的思路就
是在设置完ListView的Adapter后,根据ListView的子项目重新计算ListView的高度,然后把高度再作为
LayoutParams设置给ListView,这样它的高度就正确了,以下是源码:
public class UIHelper {
public static void setListViewHeightBasedOnChildren(ListView listView) {
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}
}
只要在设置ListView的Adapter后调用此静态方法即可让ListView正确的显示在其父ListView的ListItem中。但是要注意 的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有 重写onMeasure(),所以会在onMeasure()时抛出异常。
在ScrollView中嵌套ListView(或者ScrollView)的另外一个问题就是,子ScrollView中无法滑动的(如果它没有显示完 全的话),因为滑动事件会被父ScrollView吃掉,如果想要让子ScrollView也可以滑动,只能强行截取滑动事件,有牛人在论坛中发过代码说 可以。虽然我没有亲自试过,但估计是可行的。
虽然在ScrollView中显示ScrollView在技术上的难题可以攻破,但是这样的设计却是非常差的用户体验因为用户会不容易看到和操作子 ScrollView中的内容。比如好的设计是,父ListView的每个Item只显示概括性的描述,然后点击其Item会进入另外一个页面来详细描述 和展示以及对这个Item的操作。
Android 设置ListView不可滚动 及在ScrollView中不可滚动的设置的更多相关文章
- scrollview中停止滚动的监听
[补充]可以在主线程控制,特别注意 scrollView3.postDelayed(new Runnable() { @Override public void run() { scrollView3 ...
- android 滚动视图(ScrollView)
为了可以让内嵌布局管理器之中加入多个显示的组件,而且又保证程序不这么冗余,所以可以通过 Activity程序进行控制,向内嵌布局管理器中添加多个组件. ScrollView提供一个显示的容器,可以包含 ...
- ScrollView中嵌套GridView,Listview的办法
按照android的标准,ScrollView中是不能嵌套具有滑动特性的View的,但是有时如果设计真的有这样做的需要,或者为了更方便简单的实现外观(比如在外在的大布局需要有滑动的特性,并且内部有类似 ...
- Android实践之ScrollView中滑动冲突处理
转载注明出处:http://blog.csdn.net/xiaohanluo/article/details/52130923 1. 前言 在Android开发中,假设是一些简单的布局.都非常easy ...
- 解决在ScrollView中套用ListView显示不正常
最近在设计Android程序时,因为需要在ScrollView中添加一个ListView列表来显示一些信息.刚开始并没有想太多,但添加进去后才发现ListView不论怎样定义都只能显示一行,显示效果很 ...
- android 解决ScrollView中的子布局不能够填充整个ScrollView的情况。
在开发中如果你的xml文件的跟布局是ScrollView,在ScrollView中无论你写什么样的布局,其默认情况下都是不能填充整个布局的.也就是说你的ScrollView中的子布局设置fill_pa ...
- 关于小程序 scroll-view中设置scroll-top无效 和小说图书阅读进度条小案例
在最近的项目有做到关于小说阅读的进度条功能,其中用到scroll-view和slider组件,发现scroll-view中的scroll-top在设置值后无效,出现这种情况大概是以下几种问题: 1.s ...
- ScrollView中嵌套ListView显示
想要ScrollView中嵌套显示ListView 需要自定义ListView 并重写onMeasure方法 重新计算 heightMeasureSpec的高度 int newHeight = Me ...
- 6.设置ListView的Item的高度无效
问题: 设置ListView的Item的高度无效. 解决方式: 设置ListView的Item的minHeight属性.
随机推荐
- ZOJ 3790 Consecutive Blocks
大致题意就是给你一个数列,让你最多移除K个数字,使得连续的相同数字的长度最大,并求出最大长度. 我们将此序列按颜色排序,颜色相同的话按位置排序,那么排完序之后颜色相同的blocks就在一起,只是他们的 ...
- [Irving] Android 点击两次返回退出系统
Activity 中定义成员变量: private Long firstClickTime = 0l; //记录第一次点击时间 重载OnKeyDown方法 代码: @Override public b ...
- Sublime Text 2使用心得
一个比较详细的文章:http://www.cnblogs.com/figure9/p/sublime-text-complete-guide.html 一. 前言 作为一个前端,有一款好的开发利器是必 ...
- test-from
title header1 hahhahjl header2 adfkljasd $$a^2$$ point 1 point 2 | table1 | table2 | | ---- | ---- | ...
- Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynamics CRM 2011 2013 解决办法
Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynam ...
- Codeforces Round #306 (Div. 2) ABCDE(构造)
A. Two Substrings 题意:给一个字符串,求是否含有不重叠的子串"AB"和"BA",长度1e5. 题解:看起来很简单,但是一直错,各种考虑不周全, ...
- 整理收藏一份PHP高级工程师的笔试题
整理了一份PHP高级工程师的笔试题,问题很全面.嗯,基本上这些题都答得不错,那么你应该可以胜任大部分互联网企业的PHP职位了.下面直接上题. 1. 基本知识点 HTTP协议中几个状态码的含义:503, ...
- 问题-[VMware Workstation]断电后,重启电脑,之后就提示“内部错误”
问题现象:突然断电后,重启电脑,再打开VMware Workstation,启动不了.之后就提示“内部错误”.问题原因:希望高人指点.问题处理:关闭VMware Workstation,在快捷方式上, ...
- 如何使用iframe实现隐藏的CSRF
1.攻击者在“页面1”中http://www.b.com/indexb.html中写下如下代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...
- mmsql 查询每个分类的前3条数据
select * from (select *,row_number() over(partition by PropertyRoofBeamID order by PropertyRoomID de ...