如何在ListView中嵌套ListView
1个回答
2016-05-23
展开全部
前天在工作中遇到在ListView中的Item需要用ListView来展现处理后的内容,然后就遇到了一个很头疼的问题,作为Item的ListView没法进行滑动,而且显示也不正常,只是显示几个子Item。不能将子Item全部显示,原因是在控件绘制出来之前要对ListView的大小进行计算,要解决将子ListView全部显示出来的问题,就是重新计算一下其大小告知系统即可。后面这个问题比较好解决,网上已经给出解决方案:
前辈们给出了一个方法,重新计算子ListView的大小,然后在设置本ListView的Adapter之后运行这个方法就好了,具体代码如下:
01 /**
02
03 * 设置Listview的高度
04
05 */
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 <?xml version="1.0" encoding="utf-8"?>
03 android:layout_width="fill_parent"
04 android:layout_height="fill_parent"
05 android:orientation="vertical" >
06 <!-- 这里做demo用,直接使用了android中的ListActivity-->
07 <i.test.ParentListView android:id=" @android :id/list"
08 android:layout_width="fill_parent"
09 android:layout_height="fill_parent"
10 android:dividerHeight="2dip"
11 android:scrollbars="none"
12 />
13
14 </LinearLayout>
activity代码如下:
01 public class ListviewActivity extends ListActivity {
02 /** Called when the activity is first created. */
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){
前辈们给出了一个方法,重新计算子ListView的大小,然后在设置本ListView的Adapter之后运行这个方法就好了,具体代码如下:
01 /**
02
03 * 设置Listview的高度
04
05 */
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 <?xml version="1.0" encoding="utf-8"?>
03 android:layout_width="fill_parent"
04 android:layout_height="fill_parent"
05 android:orientation="vertical" >
06 <!-- 这里做demo用,直接使用了android中的ListActivity-->
07 <i.test.ParentListView android:id=" @android :id/list"
08 android:layout_width="fill_parent"
09 android:layout_height="fill_parent"
10 android:dividerHeight="2dip"
11 android:scrollbars="none"
12 />
13
14 </LinearLayout>
activity代码如下:
01 public class ListviewActivity extends ListActivity {
02 /** Called when the activity is first created. */
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){
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询