中易网

pageviewlistviewscrowview为什么不可以相互嵌套

答案:2  悬赏:60  
解决时间 2021-12-16 09:20
pageviewlistviewscrowview为什么不可以相互嵌套
最佳答案
每个listview Item最外层的ViewGroup,设置setclickable(true),然后在adapter的getview里面,单独设置这个viewgroup的onclick事件。
全部回答
前天在工作中遇到在listview中的item需要用listview来展现处理后的内容,然后就遇到了一个很头疼的问题,作为item的listview没法进行滑动,而且显示也不正常,只是显示几个子item。不能将子item全部显示,原因是在控件绘制出来之前要对listview的大小进行计算,要解决将子listview全部显示出来的问题,就是重新计算一下其大小告知系统即可。后面这个问题比较好解决,网上已经给出解决方案: 前辈们给出了一个方法,重新计算子listview的大小,然后在设置本listview的adapter之后运行这个方法就好了,具体代码如下: 01 06 07 public voidsetlistviewheight(listview listview) { 08 09 listadapter listadapter = listview.getadapter(); 10 11 if(listadapter == null) { 12 13 return; 14 15 } 16 17 inttotalheight = 0; 18 19 for (inti = 0; i < listadapter.getcount(); i++) { 20 21 view listitem = listadapter.getview(i, null, listview); 22 23 listitem.measure(0, 0); 24 25 totalheight += listitem.getmeasuredheight(); 26 27 } 28 29 viewgroup.layoutparams params = listview.getlayoutparams(); 30 31 params.height = totalheight + (listview.getdividerheight() * (listadapter.getcount() - 1)); 32 33 listview.setlayoutparams(params); 34 35 } 但是这个方法设置的item的layout必须是带有onmeasure()方法的控件,否则在计算的时候会报错,建议使用linearlayout。 再一个思路相同,但是,不是额外做方法来实现onmeasure()方法的计算listview的大小,而是自己继承listview,重写listview的onmeasure()方法,来自己计算listview的高度,然后再xml中直接使用这个自定义的listview就可以了。 01 public class mylistview extendslistview { 02 03 public mylistview (context context, attributeset attrs) { 04 05 super(context, attrs); 06 07 } 08 09 public mylistview (context context) { 10 11 super(context); 12 13 } 14 15 public mylistview (context context, attributeset attrs, intdefstyle) { 16 17 super(context, attrs, defstyle); 18 19 } 20 21 @override 22 23 public void onmeasure(int widthmeasurespec, intheightmeasurespec) { 24 25 intexpandspec = measurespec.makemeasurespec(integer.max_value >> 2, 26 27 measurespec.at_most); 28 29 super.onmeasure(widthmeasurespec, expandspec); 30 31 } 32 33 } 这是解决让作为item的listview显示全部内容的方案,但是有些时候我们是想让作为item的listview不用全部显示,而是可以进行滑动,要解决这个问题就需要了解一下android对事件的分发机制了 我的解决方案是集成listview,重写intercepttouchevent使其返回false来取消父listview对触摸事件的拦截,将触摸事件分发到子view来处理。然后在使用的时候,将其作为父listview使用,就可以使子listview可以滑动了。思想来源于下面链接的6楼 具体自定义父listview代码: 01 public class parentlistview extends listview { 02 03 public parentlistview(context context) { 04 05 super(context); 06 07 // todo auto-generated constructor stub 08 09 } 10 11 public parentlistview(context context, attributeset attrs, int defstyle) { 12 13 super(context, attrs, defstyle); 14 15 // todo auto-generated constructor stub 16 17 } 18 19 public parentlistview(context context, attributeset attrs) { 20 21 super(context, attrs); 22 23 // todo auto-generated constructor stub 24 25 } 26 //将 onintercepttouchevent的返回值设置为false,取消其对触摸事件的处理,将事件分发给子view 27 28 @override 29 30 public boolean onintercepttouchevent(motionevent ev) { 31 32 // todo auto-generated method stub 33 34 return false; 35 36 } 37 38 } xml文件: 01 03 android:layout_width="fill_parent" 04 android:layout_height="fill_parent" 05 android:orientation="vertical" > 06 07 13 14 activity代码如下: 01 public class listviewactivity extends listactivity { 02 03 private listview mlv;//这个listview就是自定义的view 04 private parentadapter adapter; 05 private final static string[] array = newstring[]{"1","2","3","4","5","6","7","8","9","10","11","12","13","14"}; 06 @override 07 public void oncreate(bundle savedinstancestate) { 08 super.oncreate(savedinstancestate); 09 setcontentview(r.layout.main); 10 mlv = getlistview(); 11 adapter = new parentadapter(); 12 mlv.setadapter(adapter); 13 14 } 15 private class parentadapter extends baseadapter{ 16 17 @override 18 public int getcount() { 19 // todo auto-generated method stub 20 return array.getlength(array); 21 } 22 23 @override 24 public object getitem(int position) { 25 // todo auto-generated method stub 26 return array[position]; 27 } 28 29 @override 30 public long getitemid(int position) { 31 // todo auto-generated method stub 32 return position; 33 } 34 35 @override 36 public view getview(int position, view convertview, viewgroup parent) { 37 // todo auto-generated method stub 38 view view; 39 if(position == 5){ 40 view = view.inflate(getapplicationcontext(), r.layout.item, null); 41 listview lv = (listview) view.findviewbyid(r.id.lv); 42 arrayadapter madapter = newarrayadapter(listviewactivity.this, android.r.layout.simple_list_item_1, newstring[]{"a","b", 43 "c","d","e","f","g"}); 44 lv.setadapter(madapter); 45 } 46 else{ 47 textview tv = new textview(getapplicationcontext()); 48 tv.settext(array[position]); 49 tv.settextsize(30); 50 view = tv; 51 } 52 return view; 53 } 54 55 } 56 } 上面的方法同样适合在scrollview中嵌套可以滑动view的情况。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
外厲內荏的意思是什么?外厲內荏的释义是什么
亚曼奴地址在什么地方,想过去办事
30千瓦,252米扬程的深井水泵多少钱一台
下年的意思是什么啊?请解释下!
牙检的意思是什么?牙检的释义是什么啊?
1942生阴宅立什么山向
AMD系列的主板用什么接口的显示器?为什么没
報丁的意思是什么?報丁的释义是什么啊?
和谐宿舍英语作文
对口单招到学生有哪些东西就可以被本科提前或
初音家族的编号
旱烟筒的意思是什么?旱烟筒的释义是什么啊?
请问哪位报名参加了2017年2月10号以后的考满
奚讵的意思是什么啊?请解释下!
如果你很讨厌的人老找你怎么办
推荐资讯
讼学的意思是什么啊?请解释下!
Theseagullandthefishfallsinloveisonlyanacc
染后的意思是什么?染后的释义是什么啊?
请问大话群侠传上古密卷资源文件有吗?
潍坊鲁美净水器骗局
韩语哈呢啊森吆什么意思?
惠民县县营业厅地址有知道的么?有点事想过去
5寸八核大容量大电池高像素双4g手机
求黄子韬美拍练习室solo舞蹈歌曲名字
夏家庄派出所地址有知道的么?有点事想过去!
楮实的意思是什么?楮实的释义是什么啊?
剥船的意思是什么?剥船的释义是什么啊?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?