Android之ScrollView里嵌套ListView
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Android之ScrollView里嵌套ListView,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3356字,纯文字阅读大概需要5分钟。
内容图文
ScrollView套ListView会存以下两个问题
1.里面的listView高度无法算出来,通常只能显示listview的其中一行
2.listview不能滚动
这里我用的是可展开的(ExpandableListView
解决问题一,如果ExpandableListView是的子项是用写死的布局文件来加载的,只要在设置ListView的Adapter后调用此静态方法即可让ListView正确的显示在其父ListView的ListItem中。但是要注意的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。
1 public static void setListViewHeightBasedOnChildren(ListView listView) { 2 ListAdapter listAdapter = listView.getAdapter(); 3if (listAdapter == null) { 4return; 5 } 6int totalHeight = 0; 7for (int i = 0; i < listAdapter.getCount(); i++) { 8 View listItem = listAdapter.getView(i, null, listView); 9 listItem.measure(0, 0); 10 totalHeight += listItem.getMeasuredHeight(); 11 } 12 ViewGroup.LayoutParams params = listView.getLayoutParams(); 13 params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); 14 listView.setLayoutParams(params); 15 }
如果ExpandableListView 的子项是用代码来代码动态加载的,那么给每个子项定义一个高度,这个就可以计算整个listview的高度了。代码如下:
先定义子项高度
public static final int ItemHeight = 85;
定义子项的TextView布局
1 static public TextView getTextView(Context context) { 2 AbsListView.LayoutParams lp = new AbsListView.LayoutParams( 3 ViewGroup.LayoutParams.FILL_PARENT, ItemHeight); 4 TextView textView = new TextView(context); 5 textView.setLayoutParams(lp); 6 textView.setTextColor(Color.BLACK); 7 textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); 8return textView; 9 }
然后extends BaseExpandableListAdapter中重写以下方法,其中getChild(groupPosition, childPosition).toString()是从数组中读出来的要显示在子项TextView中的文字。
1 @Override 2 public View getChildView(int groupPosition, int childPosition, 3boolean isLastChild, View convertView, ViewGroup parent) { 4 TextView textView = getTextView(this.parentContext); 5 textView.setText(getChild(groupPosition, childPosition).toString()); 6 textView.setPadding(myPaddingLeft + PaddingLeft, 0, 0, 0); 7return textView; 8 }
这样,问题一就解决了。
问题二就是ScrollView中嵌套listView后ListView不能进行滑动,只能看到显示出来的ListView一部分,解决办法原理很简单ScrollView有一个方法requestDisallowInterceptTouchEvent(boolean);这个方法是设置是否交出ontouch权限的,如果让外层的scrollview.requestDisallowInterceptTouchEvent(false);那么外层的onTouch权限会失去,这样里面的listview就能拿到ontouch权限了,listView就能滚动了。
问题是:权限只有一个,要支持两个view都能滚动。监听OnTouch的MotionEvent.ACTION_SCROLL:事件当手指触到listview的时候,让外面的scrollview交出权限,当手指触碰到listview之外的时候,让外面的scrollview重新获得权限。这样ok了。R.id.hlpg_main_lv:是listview对应的id,R.id.hlpg_main_allcontent:是listview之外的布局的id。
且看代码实现:
1 case R.id.hlpg_main_lv: 2 sView.requestDisallowInterceptTouchEvent(false); 3break; 4case R.id.hlpg_main_allcontent: 5 sView.requestDisallowInterceptTouchEvent(true); 6break; 7default: 8 sView.requestDisallowInterceptTouchEvent(true); 9break; 10
这样之后第二个问题也就解决了。
Listview中还提供了对listView滚动的监听,设置这些监听便可以做一些相应的操作
1 expandableListView.setOnScrollListener(new OnScrollListener() { 2 @Override 3publicvoid onScrollStateChanged(AbsListView view, int scrollState) { 4switch (scrollState) { // 当不滚动时 5case OnScrollListener.SCROLL_STATE_IDLE: 6// TODO coding here dosometing 7break; 8 } 9 } 10 @Override 11publicvoid onScroll(AbsListView view, int firstVisibleItem, 12int visibleItemCount, int totalItemCount) { 13// TODO coding here dosometing14 } 15 });
这个问题是在开发过程中遇到的,最初想着用其它方式来实现,发现越做越复杂还达不到想要的效果,最后翻阅资料才发现可以来切换ScrollView和ListView之间的OnTouch焦点实现嵌套滑动,希望这个技术分享解决大家遇到的同类问题
原文:http://www.cnblogs.com/falzy/p/5763895.html
内容总结
以上是互联网集市为您收集整理的Android之ScrollView里嵌套ListView全部内容,希望文章能够帮你解决Android之ScrollView里嵌套ListView所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。