我们在真实项目中通常会遇到ListView或者GridView嵌套在ScrollView中问题。但是做的时候会发现,一旦两者进行嵌套,即会发生冲突。得不到我们希望的效果。由于ListView和GridView本身都继承于ScrollView,一旦在ScrollView中嵌套ScrollView,那么里面的ScrollView高度计算就会出现问题。我们也就无法得到想要的效果。下面进入正题,我们将分别讨论ScrollView中嵌套ListView和FGridView的情况:

核心解决方案: 重写ListView或者GridView的OnMesure 方法:

[java] 
@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    // TODO Auto-generated method stub 
    int expandSpec = MeasureSpec.makeMeasureSpec(  
               Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);  
     
    super.onMeasure(widthMeasureSpec, expandSpec); 
}

一、ScrollView中嵌套ListView

BlogScrollViewActivity.java代码:

[java] 
package com.csdn.blog.scrollview; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.ScrollView; 
import android.widget.LinearLayout.LayoutParams; 
import android.widget.TextView; 
 
public class BlogScrollViewActivity extends Activity { 
     
//  MyGridView  grid; 
    ImageView image; 
    ScrollView scroll; 
    String[] texts=new String[]{"无线","通话设置","声音","显示","位置", 
                                "应用","账户","隐私权","存储","语言","游戏","娱乐","电影","音乐", 
                                "辅助功能","日期"}; 
 
    TestListView list; 
    LinearLayout.LayoutParams lp; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        init(); 
    } 
    void init(){ 
        list=(TestListView)findViewById(R.id.list); 
        image=(ImageView)findViewById(R.id.image); 
        list.setAdapter(new GridAdapter(this)); 
        scroll=(ScrollView)findViewById(R.id.scroll); 
        scroll.requestChildFocus(image, null); 
 
    } 
    private class GridAdapter extends BaseAdapter{ 
 
        Activity context; 
        public GridAdapter(Activity context){ 
            this.context=context; 
        } 
        @Override 
        public int getCount() { 
            // TODO Auto-generated method stub 
            return texts.length; 
        } 
 
        @Override 
        public Object getItem(int position) { 
            // TODO Auto-generated method stub 
            return null; 
        } 
 
        @Override 
        public long getItemId(int position) { 
            // TODO Auto-generated method stub 
            return 0; 
        } 
 
        @Override 
        public View getView(int position, View convertView, ViewGroup parent) { 
            // TODO Auto-generated method stub 
            ViewHolder holder=null; 
            if(convertView==null){ 
                convertView=context.getLayoutInflater().inflate(R.layout.item, null); 
                holder=new ViewHolder(); 
                holder.text=(TextView)convertView.findViewById(R.id.grid_text); 
                convertView.setTag(holder); 
            } 
            else{ 
                holder=(ViewHolder)convertView.getTag(); 
            } 
            holder.text.setText(texts[position]); 
            return convertView; 
        } 
        class ViewHolder { 
            TextView text; 
        } 
         
    } 
}

TestListView.java代码如下:

[java]
package com.csdn.blog.scrollview; 
 
import android.content.Context; 
import android.util.AttributeSet; 
import android.view.View.MeasureSpec; 
import android.widget.ListView; 
 
public class TestListView extends ListView{ 
 
    public TestListView(Context context) { 
        super(context); 
        // TODO Auto-generated constructor stub 
    } 
    public TestListView(Context context, AttributeSet attrs) { 
        super(context, attrs); 
        // TODO Auto-generated constructor stub 
    } 
    public TestListView(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
        // TODO Auto-generated constructor stub 
    } 
    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
        // TODO Auto-generated method stub 
        int expandSpec = MeasureSpec.makeMeasureSpec(  
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);  
         
        super.onMeasure(widthMeasureSpec, expandSpec); 
    } 
 
}

main.xml代码:

[html]
<p><?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"  
    android:background="#FFFFFF" 
    > 
    <ScrollView 
        android:layout_height="fill_parent" 
        android:layout_width="fill_parent" 
        android:fadingEdgeLength="0dp" 
        android:scrollbars="none" 
        android:id="@+id/scroll"> 
        <LinearLayout 
            android:layout_height="fill_parent" 
            android:layout_width="fill_parent" 
            android:orientation="vertical" 
            > 
      <ImageView 
          android:id="@+id/image" 
          android:layout_height="150dp" 
          android:layout_width="fill_parent" 
          android:padding="2dp" 
          android:scaleType="centerCrop" 
          android:src="@drawable/fruit"</p><p>          /> 
      <com.csdn.blog.scrollview.TestListView 
          android:id="@+id/list" 
          android:layout_height="fill_parent" 
          android:layout_width="fill_parent" 
          android:fadingEdgeLength="0dp" 
          android:scrollbars="none" 
          /> 
        </LinearLayout> 
    </ScrollView></p><p></LinearLayout></p>

效果图如下:

这里我的布局方式是上面一张图片,下面放置listView。

对于此种布局方式,可以通过另外一种方式避免此问题。由于ListView有addHeadView()方法,那么我们可以直接将上面想加入的View通过  getLayoutInflater().inflate(this,R.layout.***) 加入到ListView的顶部即可。

二、ScrollView中嵌套GridView的解决方案。

ScrollView中嵌套GridView ,最简单的方法就是重写GridView方法,使其在绘制时重新计算GridView高度

MyGridView.java代码如下:

[java]
package com.csdn.blog.scrollview; 
 
import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.GridView; 
 
public class MyGridView extends GridView{ 
 
    public MyGridView(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
        // TODO Auto-generated constructor stub 
    } 
    public MyGridView(Context context, AttributeSet attrs) { 
        super(context, attrs); 
        // TODO Auto-generated constructor stub 
    } 
    public MyGridView(Context context) { 
        super(context); 
        // TODO Auto-generated constructor stub 
    } 
    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
        // TODO Auto-generated method stub 
        int expandSpec = MeasureSpec.makeMeasureSpec(  
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);  
        super.onMeasure(widthMeasureSpec, expandSpec);  
 
    } 
}

main.xml代码如下:

[java] 
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"  
    android:background="#FFFFFF" 
    > 
    <ScrollView 
        android:layout_height="fill_parent" 
        android:layout_width="fill_parent" 
        android:fadingEdgeLength="0dp" 
        android:scrollbars="none" 
        android:id="@+id/scroll"> 
        <LinearLayout 
            android:layout_height="fill_parent" 
            android:layout_width="fill_parent" 
            android:orientation="vertical" 
            > 
            <ImageView 
                android:id="@+id/image" 
                android:layout_height="150dp" 
                android:layout_width="fill_parent" 
                android:padding="2dp" 
                android:scaleType="centerCrop" 
                android:src="@drawable/fruit" 
 
                /> 
            <com.csdn.blog.scrollview.MyGridView 
                android:layout_marginTop="10dp" 
                android:id="@+id/grid" 
                android:layout_height="fill_parent" 
                android:layout_width="fill_parent" 
                android:fadingEdgeLength="0dp" 
                android:scrollbars="none" 
                android:numColumns="3" 
                /> 
        </LinearLayout> 
    </ScrollView> 
 
</LinearLayout>

主类主要就是GridVIew数据绑定。简单贴下代码:

[java]
package com.csdn.blog.scrollview; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.BaseAdapter; 
import android.widget.GridView; 
import android.widget.ImageView; 
import android.widget.LinearLayout; 
import android.widget.ListView; 
import android.widget.ScrollView; 
import android.widget.LinearLayout.LayoutParams; 
import android.widget.TextView; 
 
public class BlogScrollViewActivity extends Activity { 
     
    MyGridView  grid; 
    ImageView image; 
    ScrollView scroll; 
    String[] texts=new String[]{"无线","通话设置","声音","显示","位置", 
                                "应用","账户","隐私权","存储","语言","游戏","娱乐","电影","音乐", 
                                "辅助功能","日期"}; 
    ArrayAdapter<String> adapter; 
    LinearLayout.LayoutParams lp; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        init(); 
    } 
    void init(){ 
        image=(ImageView)findViewById(R.id.image); 
        grid=(MyGridView)findViewById(R.id.grid); 
        grid.setAdapter(new GridAdapter(this)); 
        scroll=(ScrollView)findViewById(R.id.scroll); 
        scroll.requestChildFocus(image, null); 
 
    } 
    private class GridAdapter extends BaseAdapter{ 
 
        Activity context; 
        public GridAdapter(Activity context){ 
            this.context=context; 
        } 
        @Override 
        public int getCount() { 
            // TODO Auto-generated method stub 
            return texts.length; 
        } 
 
        @Override 
        public Object getItem(int position) { 
            // TODO Auto-generated method stub 
            return null; 
        } 
 
        @Override 
        public long getItemId(int position) { 
            // TODO Auto-generated method stub 
            return 0; 
        } 
 
        @Override 
        public View getView(int position, View convertView, ViewGroup parent) { 
            // TODO Auto-generated method stub 
            ViewHolder holder=null; 
            if(convertView==null){ 
                convertView=context.getLayoutInflater().inflate(R.layout.item, null); 
                holder=new ViewHolder(); 
                holder.image=(ImageView)convertView.findViewById(R.id.grid_image); 
                holder.text=(TextView)convertView.findViewById(R.id.grid_text); 
                convertView.setTag(holder); 
            } 
            else{ 
                holder=(ViewHolder)convertView.getTag(); 
            } 
            holder.image.setImageResource(R.drawable.meinv); 
            holder.text.setText(texts[position]); 
            return convertView; 
        } 
        class ViewHolder { 
            ImageView image; 
            TextView text; 
        } 
         
    } 
}

上述代码中  scroll.requestChildFocus(image, null); 此句主要是修复了程序进入时GridView会滑动到顶端的小bug。

GridView--scroolview嵌套listview和gridview的更多相关文章

  1. android中ScrollView嵌套ListView或GridView显示位置问题

    Android中ScrollView中嵌套ListView或GridView时在开始进入界面时总是显示中间位置,开头的位置显示不出来.这种情况下只需要在ScrollView的父控件中添加以下两行代码即 ...

  2. Android——MeasureSpec学习 - 解决ScrollView嵌套ListView和GridView冲突的方法

      原文地址:http://blog.csdn.net/yuhailong626/article/details/20639217   在自定义View和ViewGroup的时候,我们经常会遇到int ...

  3. Android之ScrollView嵌套ListView和GridView冲突

    由于ListView,GridView本身都继承于ScrollView,一旦在ScrollView中嵌套ScrollView, 在ScrollView中嵌套使用ListView或者GridView,L ...

  4. 解决ScrollView下嵌套ListView、GridView显示不全的问题

    /** * 自定义gridview,解决ListView中嵌套gridview显示不正常的问题(1行半) * @author wangyx * @version 1.0.0 2012-9-14 */ ...

  5. ScrollView嵌套ListView、GridView,进入页面显示的位置并不是在最顶部,而是在中间部分问题

    在Android项目的开发中,经常会遇到一些布局,可能需要在ScrollView中嵌套ListView或.GridView来实现, 是在使用的过程总又遇到了一个新的问题,就是如果在ScrollView ...

  6. (转)解决ScrollView嵌套ListView或者GridView导致只显示一行的方法

    即动态获取ListView和GridView的高度 一.对于ListView ListView listview= new ListView(this); setListViewHeightBased ...

  7. 解决ScrollView嵌套ListView和GridView冲突的方法

    本文摘抄自:http://blog.csdn.net/yuhailong626/article/details/20639217 原文地址:http://blog.csdn.net/yuhailong ...

  8. ScrollView嵌套ListView,GridView数据加载不全问题的解决

    我们大家都知道ListView,GridView加载数据项,如果数据项过多时,就会显示滚动条.ScrollView组件里面只能包含一个组件,当ScrollView里面嵌套listView,GridVi ...

  9. ScrollView嵌套ListView嵌套GridView的上下拉以及加载更多

    ScrollView 效果 ScrollView 说明 一个ScrollView 嵌套ListView 嵌套GridView的上拉加载更多,下拉刷新的demo. 主要是重写了GridView和Lsit ...

随机推荐

  1. hdu1025 dp(最长上升子序列LIS)

    题意:有一些穷国和一些富国分别排在两条直线上,每个穷国和一个富国之间可以建道路,但是路不能交叉,给出每个穷国和富国的联系,求最多能建多少条路 我一开始在想有点像二分图匹配orz,很快就发现,当我把穷国 ...

  2. 继承:《原型和原型链(prototype 属性使您有能力向对象添加属性和方法。)》

    二. 原型对象   在JavaScript 中,每当定义一个对象(函数)时候,对象中都会包含一些预定义的属性.其中函数对象的一个属性就是原型对象 prototype.注:普通对象没有prototype ...

  3. 用 C# 在 Windows 7 中写注册表想到的

    摘自:http://blog.163.com/dpj_001/blog/static/2742941520110251500753/ 某日做一个项目,需要在注册表中加入键,同时写值,操作系统环境为 W ...

  4. fasterflect-vs-hyperdescriptor-vs-fastmember-vs-reflection/

    http://www.codewrecks.com/blog/index.php/2008/10/04/expression-tree-vs-reflection/ http://www.codepr ...

  5. Eclipse+Maven创建webapp项目<一><二><三>

    转-http://www.cnblogs.com/candle806/p/3439469.html Eclipse+Maven创建webapp项目<一> 1.开启eclipse,右键new ...

  6. ABBYY FineReader的图像编辑器功能使用方法

    日常工作中,有时可能需要对图像进行编辑,可是正常情况下大家都知道图像是不能直接编辑的,需要借助工具.ABBYY FineReader 12 OCR文字识别软件可以实现图像的手动编辑,接下来就具体给大家 ...

  7. JS兼容IE浏览器的方法

    背景 系统需要兼容蛋疼的IE6... 解决方案 *{ 兼容IE6-8 }* <!--[if lt IE 9]> <script src="@{'/public/mng/ja ...

  8. MySQL下载、安装和修改root密码

    一.下载地址:MySQL_5.6.22_winx64_XiaZaiBa :http://rj.baidu.com/soft/detail/12585.html?ald 二.安装软件,安装到指定的路径, ...

  9. 剑指offer系列30-----删除链表中重复的节点

    [题目]在一个排序的链表中,存在重复的结点, * 请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. * 例如,链表1->2->3->3->4->4->5 ...

  10. (转)手机端html5触屏事件(touch事件)

    本文转载自:http://blog.sina.com.cn/s/blog_51048da70101f0ex.html touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时 ...