首页编程android gridview?Android Studio 如何在代码中动态添加GridView

android gridview?Android Studio 如何在代码中动态添加GridView

编程之家2023-11-0230次浏览

你是否对于android gridview和Android Studio 如何在代码中动态添加GridView感到困惑?别担心,今天小编将为您揭开这个谜团,让我们一同探索吧!

android gridview?Android Studio 如何在代码中动态添加GridView

android ScrollVIew中嵌套GridView,如何显示GridView

GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的。主要用于设置Adapter。

1.GridView常用的XML属性

属性名称描述

android:columnWidth设置列的宽度。

android:gravity设置此组件中的内容在组件中的位置。可选的值有:top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical可以多选,用“|”分开。

android:horizontalSpacing两列之间的间距。

android gridview?Android Studio 如何在代码中动态添加GridView

android:numColumns设置列数。

android:stretchMode缩放模式。

android:verticalSpacing两行之间的间距。

2.实例1

main.xml

<?xml version="1.0" encoding="utf-8"?>

android gridview?Android Studio 如何在代码中动态添加GridView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

>

<GridView

android:id="@+id/GridView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:columnWidth="90dp"

android:numColumns="3"

android:verticalSpacing="10dp"

android:horizontalSpacing="10dp"

android:stretchMode="columnWidth"

android:gravity="center"

/>

</LinearLayout>

运行效果:

3.实例2

gridview.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

>

<GridView

android:id="@+id/mygridview"

android:numColumns="3"

android:gravity="center_horizontal"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:stretchMode="columnWidth"

/>

</LinearLayout>

grid_item.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/RelativeLayout1"

android:layout_width="wrap_content"

android:layout_height="fill_parent"

android:paddingBottom="6dip"

>

<ImageView

android:id="@+id/image_item"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

/>

<TextView

android:id="@+id/text_item"

android:layout_below="@+id/image_item"

android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:layout_centerHorizontal="true"

/>

</RelativeLayout>

运行效果图:

4.实例3

main.xml

<?xml version="1.0" encoding="utf-8"?>

<GridView xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/gridview"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:columnWidth="90dp"

android:numColumns="auto_fit"

android:verticalSpacing="10dp"

android:horizontalSpacing="10dp"

android:stretchMode="columnWidth"

android:gravity="center"

/>

picture_item.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"

android:id="@+id/root"

android:orientation="vertical"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginTop="5dp"

>

<ImageView

android:id="@+id/image"

android:layout_width="100dp"

android:layout_height="150dp"

android:layout_gravity="center"

android:scaleType="fitXY"

android:padding="4dp"

/>

<TextView

android:id="@+id/title"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center"

android:gravity="center_horizontal"

/>

</LinearLayout>

效果图:

为什么android gridview只能显示一行数据

因为在Android中,有这样一个限制,两ScrollView型的控件不能相互嵌套。像ListView和GridView就都是ScrollView型的控件。因为嵌套后,两个ScrollView型控件的滑动效果就丧失了,同时被嵌套控件的高度也被限定为一行的高度。那我们还能不能嵌套两个ScrollView型的控件呢?肯定是可以的。方法有两种:一是我们去需要自定义ListView或是GridView,并重写其onMeasure()方法。如下:

public class NoScrollGridView extends GridView{

public NoScrollGridView(Context context){

super(context);

}

public NoScrollGridView(Context context, AttributeSet attrs){

super(context, attrs);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){

int expandSpec= MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>> 2,MeasureSpec.AT_MOST);

super.onMeasure(widthMeasureSpec, expandSpec);

}

}

ListView也同理。

还有一种方法是我们重新动态地计算我们现在需要的高度。在我们调用Adapter的时候,我们获得现在这个时候的GridView有多少个,单个GridView的高度,然后计算总高度。具体代码如下:

/**

*重新计算listView高度

*@param listView

*/

public static void setListViewHeightBasedOnChildren(ListView listView){

//获取ListView对应的Adapter

ListAdapter listAdapter= listView.getAdapter();

if(listAdapter== null){

return;

}

int totalHeight= 0;

for(int i= 0, len= listAdapter.getCount(); i< len; i++){// listAdapter.getCount()返回数据项的数目

View listItem= listAdapter.getView(i, null, listView);

listItem.measure(0, 0);//计算子项View的宽高

totalHeight+= listItem.getMeasuredHeight();//统计所有子项的总高度

}

ViewGroup.LayoutParams params= listView.getLayoutParams();

params.height= totalHeight

+(listView.getDividerHeight()*(listAdapter.getCount()- 1));

// listView.getDividerHeight()获取子项间分隔符占用的高度

// params.height最后得到整个ListView完整显示需要的高度

listView.setLayoutParams(params);

}

在我们setAdapter()的之前,我们调用上面的方法,如setListViewHeightBasedOnChildren(accomplishmentStateListView);

因为我是在ListView中嵌套GridView,所以重新计算GridView的总高度的时候,要放在setAdapter(...GridViewAdapter)这个BaseAdapter的衍生类里。代码如下:

/**

*计算gridview高度

*@param gridView

*/

public static void setGridViewHeightBasedOnChildren(GridView gridView){

//获取GridView对应的Adapter

ListAdapter listAdapter= gridView.getAdapter();

if(listAdapter== null){

return;

}

int rows;

int columns= 0;

int horizontalBorderHeight= 0;

Class<?> clazz= gridView.getClass();

try{

//利用反射,取得每行显示的个数

Field column= clazz.getDeclaredField("mRequestedNumColumns");

column.setAccessible(true);

columns=(Integer) column.get(gridView);

//利用反射,取得横向分割线高度

Field horizontalSpacing= clazz

.getDeclaredField("mRequestedHorizontalSpacing");

horizontalSpacing.setAccessible(true);

horizontalBorderHeight=(Integer) horizontalSpacing.get(gridView);

} catch(Exception e){

// TODO: handle exception

e.printStackTrace();

}

//判断数据总数除以每行个数是否整除。不能整除代表有多余,需要加一行

if(listAdapter.getCount()% columns> 0){

rows= listAdapter.getCount()/ columns+ 1;

} else{

rows= listAdapter.getCount()/ columns;

}

int totalHeight= 0;

for(int i= 0; i< rows; i++){//只计算每项高度*行数

View listItem= listAdapter.getView(i, null, gridView);

listItem.measure(0, 0);//计算子项View的宽高

totalHeight+= listItem.getMeasuredHeight();//统计所有子项的总高度

}

ViewGroup.LayoutParams params= gridView.getLayoutParams();

params.height= totalHeight+ horizontalBorderHeight*(rows- 1);//最后加上分割线总高度

gridView.setLayoutParams(params);

}

这样我们就可以在ListView中添加GridView了。。。

注:两个SrcollView型的控件可以是:

<ListView, GridView>;

<GridView,ListView>;

<ListView,ListView>;

<GridView, GridView>;

<ListView, ScrollView>;

<ScrollView,ListView>;

<GridView, ScrollView>;

<ScrollView, GridView>;

<ScrollView, ScrollView>;

......

Android Studio 如何在代码中动态添加GridView

DecorView是android界面的顶级View,当前界面的整个即为DecorView。DecorView为FrameLayout,而DecorView一般会包含一个竖直方向的LinearLayout。这个竖直方向的LinearLayout一般分为两个部分(具体Android版本和主题有所不同),上部分为标题栏,下部分为内容栏,而内容栏的id为 android.R.id.content,内容栏也是FrameLayout,我们使用setContentView(),的布局加入的就是内容栏。

动态添加View一般是添加在我们自己的布局文件里,而setContentView时加入的我们的布局是内容栏的第一个子View,所以我们需要获取到我们的布局对应的View。

####如何获取DecorView?

在Activity中直接调用 getWindow().getDecorView()

####如何获取ContentView?

在Activity中调用

FrameLayout contentView=(FrameLayout)getWindow().getDecorView().findViewById(android.R.id.content);

或直接:

FrameLayout contentView=(FrameLayout)activity.findViewById(android.R.id.content);

####获取我们填充的布局

ViewGroup viewGroup=(ViewGroup)contentView.getChildAt(0);

####添加View

文章分享到这里,希望我们关于android gridview的内容能够给您带来一些新的认识和思考。如果您还有其他问题,欢迎继续探索我们的网站或者与我们交流,我们将尽力为您提供满意的答案。

seo门户 seo怎么优化网站传奇服务器租用,传奇服务器租用哪家公司的好