分享

Android屏幕显示不全时使用ScrollView (SrollView与ListView的纠结)

 Ebric 2011-06-14
 当内容过大屏幕无法显示完全时,可以使用ScrollView来扩大器显示区域。

【使用限制】
    1.ScrollView是Framelayout的一种特殊形态。ScrollView只能包含一个View或一个ViewGroup。并且其布局必须是LinearLayout.

    2.不能将ScrollView和ListView混在一起用,因为Android本身已针对ListView作了适应大规模数据的显示处理。

正常来说,在ScrollView添加一个ListView后在真机上只会显示ListView的一行多一点,我也不理解为什么会这样,后来我把ListView的layout_height改成400dip,而不是用match_parent和wrap_content,我发现这样的话ListView就显示的多了很多。所以就产生了把ListView所有的item的高度算出来给ListView设置的想法。下面是代码: 
Java代码  收藏代码

  1. public void setListViewHeightBasedOnChildren(ListView listView) {  
  2.         ListAdapter listAdapter = listView.getAdapter();   
  3.         if (listAdapter == null) {  
  4.             return;  
  5.         }  
  6.   
  7.         int totalHeight = 0;  
  8.         for (int i = 0; i < listAdapter.getCount(); i++) {  
  9.             View listItem = listAdapter.getView(i, null, listView);  
  10.             listItem.measure(00);  
  11.             totalHeight += listItem.getMeasuredHeight();  
  12.         }  
  13.   
  14.         ViewGroup.LayoutParams params = listView.getLayoutParams();  
  15.         params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));  
  16.         params.height += 5;//if without this statement,the listview will be a little short  
  17.         listView.setLayoutParams(params);  
  18.     }  


设置listView高度的另一种写法(因为有时上面的那种写法会报类转换异常):
 LayoutParams params = (LayoutParams) getListView().getLayoutParams();
       params.height = height;
       params.width = LayoutParams.FILL_PARENT;        
       getListView().setLayoutParams(params);


在代码的倒数第二行二我又给加了5个像素,这是因为我在listview的属性里面添加了padding=5dip。 
然后每次ListView的数据一有变化就用这个函数设置一下就好了,不过这样总感觉效率很低,希望有达人给指点一下。 

简单来说就是把layout_height写死,这种办法也很适用于GridView(如果能估计得出GridView的高度的话)。 


listview与ScrollView老问题的另类解法 
http://www./thread-42893-1-1.html 
这几天一直被listview怎么合理的放进scorllview中的问题困扰,尝试过把listview放入scorllview中的朋友都知道,被放入的listview显示是有问题的,无论怎么设置layout都只显示大概2行的高度,看起来很郁闷,更别说美观了,后来上网查询了一下,解决方法有的是用linearlayout替换listview,还有修改onmeasure的,我比较懒个人感觉很麻烦不喜欢,终于想出了一个还算和谐的解决方法:xml中的textlist设置如下: 
<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout xmlns:android="http://schemas./apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:background="#44444444"> 
<ScrollView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
    <LinearLayout 
            android:id="@+id/ll1" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content" 
            android:scrollbars="vertical" 
            android:orientation="vertical" 
            android:paddingLeft="15dp" 
            android:paddingRight="15dp" 
            android:paddingTop="30dp" 
            android:paddingBottom="30dp" 
            android:background="#ff888888"> 
            <TextView 
                    android:text="あ" 
                    android:textColor="#ffeeeeee" 
                    android:textSize="18sp" 
                    android:layout_width="fill_parent" 
                    android:layout_height="wrap_content"></TextView> 
            <ListView 
                    android:scrollbars="none" 
                    android:stackFromBottom="true" 
                    android:id="@+id/lv0" 
                    android:layout_width="fill_parent" 
                    android:layout_height="20dp"></ListView> 
                    </LinearLayout> 
</ScrollView> 
</LinearLayout> 
其中的textview是我做的东西要用到的,和方法无关可以不看,然后就是在java中重新设置listview的高度了,目的是把listview“撑”开: 
LinearLayout.LayoutParams  lp5 =new LinearLayout.LayoutParam(LayoutParams.FILL_PARENT, listItem.size()*51-1); 
其中第一个属性不必说了,第二个是为了计算listview要设置的总高度用的,51是我事先设置好的一行的高度(50)+每行之间的间隔(1)而得来的,listItem.size()是我要显示的行数,用.setLayoutParams(lp5);来重新设置高度,其他别的设置跟以前一样,想要源码我整理完之后贴出来 


如果不想写死,那就看下面的文章 
Android 解决ListView 和 ScrollView 共存冲突的问题 
http://labs./mblog/532767_72693?wralxianxrnx 
http://blog./?p=503



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多