pageviewlistviewscrowview为什么不可以相互嵌套
答案:2 悬赏:60
解决时间 2021-12-16 09:20
- 提问者网友:沉默的哀伤
- 2021-12-15 15:01
pageviewlistviewscrowview为什么不可以相互嵌套
最佳答案
- 二级知识专家网友:一只傻青衣
- 2021-12-15 15:36
每个listview Item最外层的ViewGroup,设置setclickable(true),然后在adapter的getview里面,单独设置这个viewgroup的onclick事件。
全部回答
- 1楼网友:木子香沫兮
- 2021-12-15 16:38
前天在工作中遇到在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的情况。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |