原CSDN博客已弃用,文章会逐渐迁移过来。

一.滚动视图的基础概念

滚动视图用于为其它组件添加滚动条,在默认的情况下,当窗体中内容比较多,而一屏显示不下时, 超出的部分不能被用户所看到.因为Android的布局管理器本身没有提供滚动屏幕的功能.如果 要让其滚动,就要使用滚动视图ScrllView.
滚动视图是FrameLayout的子类,因此,在滚动视图中,可以添加任何想要放入其中的组件,但是一个滚动视图中只能放一个组件,如果要放置多个,可以先放一个存布局管理器.再将要放置的组件放置到该布局管理器中,在滚动视图中,使用比较多的是线性布局管理器.

(一)滚动视图(ScrollView)的XML配置:

 <ScrollView  
android:id="@+id/myscollView"    
android:layout_width="match_parent"   
 android:layout_height="wrap_content" >   
//这里只能放一个布局或控件  
//一般是放LinearLayout布局  
</ScrollView>  

(二)水平滚动视图(HorizontalScrollView)

HorizontalScrollView和ScrollView差不多,只是滚动方式为横向
XML配置:

<HorizontalScrollView   
android:id="@+id/scrollView1"   
android:layout_width="match_parent"  
android:layout_height="wrap_content" >  
 </HorizontalScrollView>  

滚动视图的作用:

1.滚动视图使用后能让里面的视图控件没展示的部分滚动后可以展示
比如一个TextView默认情况文本过大后,超出屏幕或框体的内容是不能显示出来的,但是如果把这个TextView放到一个滚动视图中,就能上下滚动显示没有显示的文本内容。
2.水平滚动的视图内显示横向拉伸的布局的内容
比如一个水平的LinearLayout放置十个按钮,那么只能显示五个,如果把这个LinearLayout放在一个水平滚动的视图中,就可以水平的拖动视图显示后面的按钮。
值得注意的是ListView是默认带滚动的,不需要滚动视图的包裹。
而Android的五六布局(线性布局,相对布局,绝对布局,表格布局,网格布局,层布局)和简单控件(TextView,ImageView等等)默认是不能滚动显示的,除非放到滚动视图中。
还有一点值得注意的是,如果ListView放到ScrollView中去这里ListView要自定义的拉长,否则会默认显示ListView中的一行数据,要拉伸才显示其他内容。
二.简单展示的示例程序
(一)布局文件activity_main.xml设计

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent" >  

    <ScrollView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:scrollbars="none" >  

        <LinearLayout  
            android:layout_width="match_parent"  
            android:layout_height="match_parent"  
            android:orientation="vertical" >  

            <TextView  
                android:id="@+id/tv_title"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content" />  

            <TextView  
                android:id="@+id/tv_content"  
                android:layout_width="wrap_content"  
                android:layout_height="wrap_content" />  
        </LinearLayout>  
    </ScrollView>  

</RelativeLayout>  

(二)java代码设计

import android.app.Activity;  
import android.os.Bundle;  
import android.widget.TextView;  

/** 
 * ScrollView的简单展示 
 */  
public class MainActivity extends Activity {  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        TextView tvTile = (TextView) findViewById(R.id.tv_title);  
        tvTile.setTextSize(30);  
        tvTile.setText("文章标题:。。。");  
        TextView tv = (TextView) findViewById(R.id.tv_content);  
        tv.setTextSize(20);  
        CharSequence text = "锅盔的原材料都是庄稼人自家酿种的。"   
        + "\n" + "面粉是自家地里种的小麦磨成的;"  
        + "\n" + "是自家饲养的鸡产的;香豆子," + "\n"  
                + "是自家地埂上撒出来的。这些材料," + "\n"   
                +  "也是靠老天的眷顾,才有的。山区," + "\n"  
                + "就是靠天吃饭。万一哪一年," + "\n"   
                + "老天一生气不下雨,山就荒了," + "\n"  
                + "地也荒了,人也慌了," + "\n"    
                + "妈妈的锅盔也会瘪了。" + "\n"  
                + "妈妈经过泡发面、和面、醒面等几道程序," + "\n"   
                + "把这些材料依次揉进面里," + "\n"  
                + "再切成碗口大的面团,揉成馒头,再用擀杖稍稍一擀,"  
                + "\n"  
                + "或用手掌稍稍一按,就成了一寸多高、盘子大小的圆饼。"   
                + "\n" + "灵巧、细心、唯美的妈妈总不忘在饼上面"  
                + "\n" + "用菜刀画出美丽对称的图案:三角形、四边形、菱形等等。" + "\n"  
                + "妈妈的爱,就在那揉、擀、按、画的过程中," + "\n"   
                + "一点一点渗进锅盔里,流进我的血脉里。弄好的锅";  
        tv.setText(text);  

    }  

}  

程序运行后的显示界面:

页面往下拉显示的界面:

如果ListView或GridView放在ScrollVIew中要做的处理:
如果是ListView在ScrollView中时的处理:

import android.content.Context;  
import android.util.AttributeSet;  
import android.widget.ListView;  

/** 
 * 可滚动的ListView,这里是因为这个ListView被包裹在一个ScrollView中才需要设置纵向拉伸 
 */  

public class ScrollListView extends ListView {  
    public ScrollListView(Context context) {  
        super(context);  
    }  

    public ScrollListView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  

    @Override  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
        int height = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);  
        super.onMeasure(widthMeasureSpec, height);  
    }  
}  

如果是GridView在ScrollView中时的处理:

import android.content.Context;  
import android.util.AttributeSet;  
import android.widget.GridView;  

/** 
 * 重写网格View,设置高度 
 * 可滚动的GridView,这里是因为这个GridView被包裹在一个ScrollView中才需要设置纵向拉伸 
 */  

public class ScrollGridView extends GridView {  
    public ScrollGridView(Context context) {  
        super(context);  
    }  

    public ScrollGridView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  

    @Override  
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
        int height = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);  
        super.onMeasure(widthMeasureSpec, height);  
    }  
}  

使用的时候把这两个类分别当中ListView和GridView使用就可以了。

比如:

<ScrollView  
       android:layout_width="match_parent"  
       android:layout_height="match_parent">  

       <LinearLayout  
           android:layout_width="match_parent"  
           android:layout_height="match_parent"  
           android:orientation="vertical">  

           <TextView  
               android:layout_width="match_parent"  
               android:layout_height="wrap_content"  
               android:background="@color/hint_color"  
               android:padding="10dp"  
               android:text="历史记录"  
               />  

           <TextView  
               android:id="@+id/tv_history"  
               android:layout_width="match_parent"  
               android:layout_height="wrap_content"  
               android:padding="10dp"  
               android:text="当前还没有历史记录" />  
           //包名+类名  
           <com.lwz.mathbox.weight.ScrollGridView  
               android:id="@+id/gv_topic"  
               android:layout_width="match_parent"  
               android:layout_height="wrap_content"  
               android:background="@color/hint_color"  
               android:horizontalSpacing="1dp"  
               android:numColumns="2"  
               android:verticalSpacing="1dp" />  

           <TextView  
               android:layout_width="match_parent"  
               android:layout_height="wrap_content"  
               android:background="@color/hint_color"  
               android:padding="10dp"  
               android:text="社区热门"  
              />  
           //包名+类名  
           <com.lwz.mathbox.weight.ScrollListView  
               android:id="@+id/lv_topic"  
               android:layout_width="match_parent"  
               android:layout_height="match_parent" />  

       </LinearLayout>  
   </ScrollView>