android ListView嵌套的处理方法

        昨天开发遇到一个很诡异的问题,项目中需要在一个listview中嵌套另外一个listview,但是不管怎么设置,内部的listview总是只显示一项。后来终于搞明白,原因是在控件绘制出来之前要对ListView的大小进行measure,问题就出在内部listview的测量阶段,只需要在onMeasure()函数中对listview的高度重新measure就可以了。我们需要继承ListView控件,然后重写它的onMeasure方法,如下:

    @Override

    protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {

        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);

        super.onMeasure(widthMeasureSpec, expandSpec);

    } 

       我们指定了一个很大的值,因为我们不知道我们的listview具体有多高,所以使用了最大模式MeasureSpec.AT_MOST,它表示listview的最大高度为Integer.MAX_VALUE >> 2,如果listview显示的高度小于这个值,就显示其实际的高度。

       这种方法可以使内部的listview全部显示出来,但是它是不能单独滚动的,只能随着外部的listview一起滚动。

       从网上看到还有另外一种方式也可以达到这个效果,它是在设置了listview的adpater之后,根据当前listview的item的项数来计算它的实际高度,这个值是确定的。具体的方法如下:

  1. /**  
  2.  
  3.      * 设置Listview的高度  
  4.  
  5.      */    
  6.   
  7.     public void setListViewHeight(ListView listView) {     
  8.   
  9.         ListAdapter listAdapter = listView.getAdapter();      
  10.   
  11.         if (listAdapter == null) {     
  12.   
  13.             return;     
  14.   
  15.         }     
  16.   
  17.         int totalHeight = 0;     
  18.   
  19.         for (int i = 0; i < listAdapter.getCount(); i++) {     
  20.   
  21.             View listItem = listAdapter.getView(i, null, listView);     
  22.   
  23.             listItem.measure(00);     
  24.   
  25.             totalHeight += listItem.getMeasuredHeight();     
  26.   
  27.         }     
  28.   
  29.         ViewGroup.LayoutParams params = listView.getLayoutParams();     
  30.   
  31.         params.height = totalHeight + (listView.getDividerHeight() * 
  32.                           (listAdapter.getCount() - 1));     
  33.   
  34.         listView.setLayoutParams(params);    
  35.   
  36.     }    
        这种方法我没有验证是不是可以达到我需要的效果。

你可能感兴趣的:(android,ListView,嵌套)