问题出现原因:布局中用到了ListView,但是无奈界面上又不是只有ListView 当内容变多时,需要滚动界面。大致布局如下
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@color/app_bg"
- android:orientation="vertical" >
- <ScrollView
- android:id="@+id/scSpace"
- android:layout_width="match_parent"
- android:layout_height="wrap_content" >
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
- <ImageView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:src="@drawable/shadow_title" />
- <ListView
- android:id="@+id/listview_personalhealthindex"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:background="@color/app_bg" >
- </ListView>
- </LinearLayout>
- </ScrollView>
- </LinearLayout>
滚动的解决办法1:在
- listView.setAdapter(indexAdapter);
- public static void setListViewHeightBasedOnChildren(ListView listView) {
- ListAdapter listAdapter = listView.getAdapter();
- if (listAdapter == null) {
- // pre-condition
- return;
- }
- int totalHeight = 0;
- for (int i = 0; i < listAdapter.getCount(); i++) {
- View listItem = listAdapter.getView(i, null, listView);
- listItem.measure(0, 0);
- totalHeight += listItem.getMeasuredHeight();
- }
- ViewGroup.LayoutParams params = listView.getLayoutParams();
- params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
- listView.setLayoutParams(params);
- }
即可解决,但是这样会造成一个小的问题打开该界面时,会显示到底部而不是从顶部显示
滚动的解决办法2:
实现原理 重写onMeasure代码,停用GridView的滚动功能
这里以GridView为例,重写GridView,布局代码如下:ListView同样的原理
- <com.example.ui.MyGridView
- android:id="@+id/healthhomereson_gv"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:layout_margin="@dimen/margin_medium"
- android:background="@color/white"
- android:descendantFocusability="blocksDescendants"
- android:numColumns="3" >
- </com.example.ui.MyGridView>
- package com.example.ui;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.widget.GridView;
- public class MyGridView extends GridView {
- public MyGridView(Context context) {
- super(context);
- }
- public MyGridView(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
- public MyGridView(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
- //该自定义控件只是重写了GridView的onMeasure方法,使其不会出现滚动条,ScrollView嵌套ListView也是同样的道理,不再赘述。
- @Override
- public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int expandSpec = MeasureSpec.makeMeasureSpec(
- Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
- super.onMeasure(widthMeasureSpec, expandSpec);
- }
- }
现实顶部的解决办法1:初始化的时候就让该界面的顶部的某一个控件获得焦点,滚动条自然就显示到顶部了,代码如下:
- txtBaseMsg.setFocusable(true);
- txtBaseMsg.setFocusableInTouchMode(true);
- txtBaseMsg.requestFocus();
- listview.post(new Runnable() {
- @Override
- public void run() {
- ((ScrollView)findViewById(R.id.scSpace)).scrollTo(0, 0);
- }
- });