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:numColumns设置列数。
android:stretchMode缩放模式。
android:verticalSpacing两行之间的间距。
2.实例1
main.xml
<?xml version="1.0" encoding="utf-8"?>
<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的内容能够给您带来一些新的认识和思考。如果您还有其他问题,欢迎继续探索我们的网站或者与我们交流,我们将尽力为您提供满意的答案。