GridView--scroolview嵌套listview和gridview
我们在真实项目中通常会遇到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的更多相关文章
- android中ScrollView嵌套ListView或GridView显示位置问题
Android中ScrollView中嵌套ListView或GridView时在开始进入界面时总是显示中间位置,开头的位置显示不出来.这种情况下只需要在ScrollView的父控件中添加以下两行代码即 ...
- Android——MeasureSpec学习 - 解决ScrollView嵌套ListView和GridView冲突的方法
原文地址:http://blog.csdn.net/yuhailong626/article/details/20639217 在自定义View和ViewGroup的时候,我们经常会遇到int ...
- Android之ScrollView嵌套ListView和GridView冲突
由于ListView,GridView本身都继承于ScrollView,一旦在ScrollView中嵌套ScrollView, 在ScrollView中嵌套使用ListView或者GridView,L ...
- 解决ScrollView下嵌套ListView、GridView显示不全的问题
/** * 自定义gridview,解决ListView中嵌套gridview显示不正常的问题(1行半) * @author wangyx * @version 1.0.0 2012-9-14 */ ...
- ScrollView嵌套ListView、GridView,进入页面显示的位置并不是在最顶部,而是在中间部分问题
在Android项目的开发中,经常会遇到一些布局,可能需要在ScrollView中嵌套ListView或.GridView来实现, 是在使用的过程总又遇到了一个新的问题,就是如果在ScrollView ...
- (转)解决ScrollView嵌套ListView或者GridView导致只显示一行的方法
即动态获取ListView和GridView的高度 一.对于ListView ListView listview= new ListView(this); setListViewHeightBased ...
- 解决ScrollView嵌套ListView和GridView冲突的方法
本文摘抄自:http://blog.csdn.net/yuhailong626/article/details/20639217 原文地址:http://blog.csdn.net/yuhailong ...
- ScrollView嵌套ListView,GridView数据加载不全问题的解决
我们大家都知道ListView,GridView加载数据项,如果数据项过多时,就会显示滚动条.ScrollView组件里面只能包含一个组件,当ScrollView里面嵌套listView,GridVi ...
- ScrollView嵌套ListView嵌套GridView的上下拉以及加载更多
ScrollView 效果 ScrollView 说明 一个ScrollView 嵌套ListView 嵌套GridView的上拉加载更多,下拉刷新的demo. 主要是重写了GridView和Lsit ...
随机推荐
- JS 排序算法
冒泡排序: 核心思想:从第一个开始遍历数组,遍历完成后,让最小的值放在第一位:然后从第二个开始遍历数组,遍历完成后将最小值放在第二位:以此类推,所有位的数组遍历完成后就排序完成. var arr = ...
- PHP间隔一段时间执行
for ($i=0; $i < 20; $i++) { $m=M('vote'); $rs=$m->order('id')->select(); $randnum=array(0,1 ...
- 磁盘参数修订[转自vbird]
某些时刻,你可能会希望修改一下目前文件系统的一些相关信息,举例来说,你可能要修改 Label name , 或者是 journal 的参数,或者是其他硬盘运行时的相关参数 (例如 DMA 启动与否-) ...
- freeswitch 挂断前执行脚本
通道变量名 api_hangup_hook 介绍在挂断时执行指定API命令 示例 <action application="set" data="api_hangu ...
- Linux下tmpfs介绍及使用
tmpfs介绍 tmpfs是一种虚拟内存文件系统,而不是块设备.是基于内存的文件系统,创建时不需要使用mkfs等初始化它最大的特点就是它的存储空间在VM(virtual memory),VM是由lin ...
- Don’t Assume – Per Session Buffers
MySQL has a number of global buffers, i.e. your SGA. There are also a number of per session/thread b ...
- SharePoint入门识记
SharePoint站点层次结构: 1.Web Application: 一般创建后对应一个IIS Web Site, 默认创建后是打不开的,因为网站没有任何内容. 2.Site Collection ...
- C#的委托 Action<>和Func<>
其实他们两个都是委托[代理]的简写形式. 一.[action<>]指定那些只有输入参数,没有返回值的委托 Delegate的代码: [csharp] public delegate vo ...
- 【转】GridView中页脚汇总显示
来源:http://blog.csdn.net/atian15/article/details/3495514 有时候需要在GridView的页脚中汇总显示一些信息,常见的方法有两种: 1.在SQL中 ...
- 用HTML5构建一个流程图绘制工具
在我们的开发工程中经常会使用到各种图,所谓的图就是由节点和节点之间的连接所形成的系统,数学上专门有一个分支叫图论(Graph Theroy).利用图我们可以做很多工具,比如思维导图,流程图,状态机,组 ...