如何在ListView中嵌套ListView

 我来答
匿名用户
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){
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式