Android學習之——ScrollView和ListView,GridView嵌套

問題出現原因:佈局中用到了ListView,但是無奈界面上又不是隻有ListView 當內容變多時,需要滾動界面。大致佈局如下

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:background="@color/app_bg"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <ScrollView  
  9.         android:id="@+id/scSpace"  
  10.         android:layout_width="match_parent"  
  11.         android:layout_height="wrap_content" >  
  12.   
  13.         <LinearLayout  
  14.             android:layout_width="match_parent"  
  15.             android:layout_height="wrap_content"  
  16.             android:orientation="vertical" >  
  17.   
  18.             <ImageView  
  19.                 android:layout_width="match_parent"  
  20.                 android:layout_height="wrap_content"  
  21.                 android:src="@drawable/shadow_title" />  
  22.   
  23.             <ListView  
  24.                 android:id="@+id/listview_personalhealthindex"  
  25.                 android:layout_width="match_parent"  
  26.                 android:layout_height="wrap_content"  
  27.                 android:background="@color/app_bg" >  
  28.             </ListView>  
  29.         </LinearLayout>  
  30.     </ScrollView>  
  31.   
  32. </LinearLayout>  
這樣的佈局會導致ListView顯示不全,問題相當棘手,好在萬能的網友給出了答案

滾動的解決辦法1:在

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. listView.setAdapter(indexAdapter);  
後面加入如下方法:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. public static void setListViewHeightBasedOnChildren(ListView listView) {  
  2.     ListAdapter listAdapter = listView.getAdapter();   
  3.     if (listAdapter == null) {  
  4.         // pre-condition  
  5.         return;  
  6.     }  
  7.   
  8.     int totalHeight = 0;  
  9.     for (int i = 0; i < listAdapter.getCount(); i++) {  
  10.         View listItem = listAdapter.getView(i, null, listView);  
  11.         listItem.measure(00);  
  12.         totalHeight += listItem.getMeasuredHeight();  
  13.     }  
  14.   
  15.     ViewGroup.LayoutParams params = listView.getLayoutParams();  
  16.     params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));  
  17.     listView.setLayoutParams(params);  
  18. }  

即可解決,但是這樣會造成一個小的問題打開該界面時,會顯示到底部而不是從頂部顯示


滾動的解決辦法2

實現原理 重寫onMeasure代碼,停用GridView的滾動功能

這裏以GridView爲例,重寫GridView,佈局代碼如下:ListView同樣的原理

[html] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. <com.example.ui.MyGridView  
  2.     android:id="@+id/healthhomereson_gv"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:layout_margin="@dimen/margin_medium"  
  6.     android:background="@color/white"  
  7.     android:descendantFocusability="blocksDescendants"  
  8.     android:numColumns="3" >  
  9. </com.example.ui.MyGridView>  
重寫GridView代碼如下:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. package com.example.ui;  
  2.   
  3. import android.content.Context;  
  4. import android.util.AttributeSet;  
  5. import android.widget.GridView;  
  6.   
  7. public class MyGridView extends GridView {  
  8.     public MyGridView(Context context) {     
  9.         super(context);     
  10.     }   
  11.     public MyGridView(Context context, AttributeSet attrs) {  
  12.         super(context, attrs);  
  13.     }  
  14.     public MyGridView(Context context, AttributeSet attrs, int defStyle) {     
  15.         super(context, attrs, defStyle);     
  16.     }  
  17. //該自定義控件只是重寫了GridView的onMeasure方法,使其不會出現滾動條,ScrollView嵌套ListView也是同樣的道理,不再贅述。   
  18.     @Override   
  19.     public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  20.         int expandSpec = MeasureSpec.makeMeasureSpec(   
  21.                 Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);   
  22.         super.onMeasure(widthMeasureSpec, expandSpec);   
  23.     }   
  24. }  


現實頂部的解決辦法1:初始化的時候就讓該界面的頂部的某一個控件獲得焦點,滾動條自然就顯示到頂部了,代碼如下:

[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. txtBaseMsg.setFocusable(true);  
  2. txtBaseMsg.setFocusableInTouchMode(true);  
  3. txtBaseMsg.requestFocus();  
現實頂部的解決辦法2:在加入setListViewHeightBasedOnChildren(listView);的後面我們加入如下代碼:
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
  1. listview.post(new Runnable() {  
  2.                   
  3.                 @Override  
  4.                 public void run() {  
  5.                     ((ScrollView)findViewById(R.id.scSpace)).scrollTo(00);  
  6.                       
  7.                 }  
  8.             });  
同樣也可完美解決,注:scSpace是ScorollView的id
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章