android gridview(androidstudio)

admin 198 0

大家好,今天小编来为大家解答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>;

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!