大家好,今天小编来为大家解答android gridview这个问题,androidstudio很多人还不知道,现在让我们一起来看看吧!
一、Android Studio 如何在代码中动态添加GridView
1、DecorView是android界面的顶级View,当前界面的整个即为DecorView。DecorView为FrameLayout,而DecorView一般会包含一个竖直方向的LinearLayout。这个竖直方向的LinearLayout一般分为两个部分(具体Android版本和主题有所不同),上部分为标题栏,下部分为内容栏,而内容栏的id为 android.R.id.content,内容栏也是FrameLayout,我们使用setContentView(),的布局加入的就是内容栏。
2、动态添加View一般是添加在我们自己的布局文件里,而setContentView时加入的我们的布局是内容栏的第一个子View,所以我们需要获取到我们的布局对应的View。
3、在Activity中直接调用 getWindow().getDecorView()
4、FrameLayout contentView=(FrameLayout)getWindow().getDecorView().findViewById(android.R.id.content);
5、FrameLayout contentView=(FrameLayout)activity.findViewById(android.R.id.content);
6、ViewGroup viewGroup=(ViewGroup)contentView.getChildAt(0);
二、android ScrollVIew中嵌套GridView,如何显示GridView
GridView(网格视图)是按照行列的方式来显示内容的,一般用于显示图片,图片等内容,比如实现九宫格图,用GridView是首选,也是最简单的。主要用于设置Adapter。
android:columnWidth设置列的宽度。
android:gravity设置此组件中的内容在组件中的位置。可选的值有:top、bottom、left、right、center_vertical、fill_vertical、center_horizontal、fill_horizontal、center、fill、clip_vertical可以多选,用“|”分开。
android:horizontalSpacing两列之间的间距。
android:verticalSpacing两行之间的间距。
<?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"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
<?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"
android:gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:stretchMode="columnWidth"
<?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:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_below="@+id/image_item"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_centerHorizontal="true"
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
<?xml version="1.0" encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_height="150dp"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center_horizontal"
三、为什么android gridview只能显示一行数据
1、因为在Android中,有这样一个限制,两ScrollView型的控件不能相互嵌套。像ListView和GridView就都是ScrollView型的控件。因为嵌套后,两个ScrollView型控件的滑动效果就丧失了,同时被嵌套控件的高度也被限定为一行的高度。那我们还能不能嵌套两个ScrollView型的控件呢?肯定是可以的。方法有两种:一是我们去需要自定义ListView或是GridView,并重写其onMeasure()方法。如下:
2、public class NoScrollGridView extends GridView{
3、public NoScrollGridView(Context context){
4、public NoScrollGridView(Context context, AttributeSet attrs){
5、protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
6、int expandSpec= MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>> 2,MeasureSpec.AT_MOST);
7、super.onMeasure(widthMeasureSpec, expandSpec);
8、还有一种方法是我们重新动态地计算我们现在需要的高度。在我们调用Adapter的时候,我们获得现在这个时候的GridView有多少个,单个GridView的高度,然后计算总高度。具体代码如下:
9、public static void setListViewHeightBasedOnChildren(ListView listView){
10、ListAdapter listAdapter= listView.getAdapter();
11、for(int i= 0, len= listAdapter.getCount(); i< len; i++){// listAdapter.getCount()返回数据项的数目
12、View listItem= listAdapter.getView(i, null, listView);
13、listItem.measure(0, 0);//计算子项View的宽高
14、totalHeight+= listItem.getMeasuredHeight();//统计所有子项的总高度
15、ViewGroup.LayoutParams params= listView.getLayoutParams();
16、+(listView.getDividerHeight()*(listAdapter.getCount()- 1));
17、// listView.getDividerHeight()获取子项间分隔符占用的高度
18、// params.height最后得到整个ListView完整显示需要的高度
19、listView.setLayoutParams(params);
20、在我们setAdapter()的之前,我们调用上面的方法,如setListViewHeightBasedOnChildren(accomplishmentStateListView);
21、因为我是在ListView中嵌套GridView,所以重新计算GridView的总高度的时候,要放在setAdapter(...GridViewAdapter)这个BaseAdapter的衍生类里。代码如下:
22、public static void setGridViewHeightBasedOnChildren(GridView gridView){
23、ListAdapter listAdapter= gridView.getAdapter();
24、int horizontalBorderHeight= 0;
25、Class<?> clazz= gridView.getClass();
26、//利用反射,取得每行显示的个数
27、Field column= clazz.getDeclaredField("mRequestedNumColumns");
28、columns=(Integer) column.get(gridView);
29、//利用反射,取得横向分割线高度
30、Field horizontalSpacing= clazz
31、.getDeclaredField("mRequestedHorizontalSpacing");
32、horizontalSpacing.setAccessible(true);
33、horizontalBorderHeight=(Integer) horizontalSpacing.get(gridView);
34、//判断数据总数除以每行个数是否整除。不能整除代表有多余,需要加一行
35、if(listAdapter.getCount()% columns> 0){
36、rows= listAdapter.getCount()/ columns+ 1;
37、rows= listAdapter.getCount()/ columns;
38、for(int i= 0; i< rows; i++){//只计算每项高度*行数
39、View listItem= listAdapter.getView(i, null, gridView);
40、listItem.measure(0, 0);//计算子项View的宽高
41、totalHeight+= listItem.getMeasuredHeight();//统计所有子项的总高度
42、ViewGroup.LayoutParams params= gridView.getLayoutParams();
43、params.height= totalHeight+ horizontalBorderHeight*(rows- 1);//最后加上分割线总高度
44、gridView.setLayoutParams(params);
45、这样我们就可以在ListView中添加GridView了。。。
46、注:两个SrcollView型的控件可以是:
47、<ScrollView, ScrollView>;
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!