Android GridView无法填充Activity的解决办法

GridView相信也很常见,但是GridView有一个缺点就是无法控制整个GridView的高度,只能通过子view去控制其高度。

项目中往往会有这样需求,让一个Gridview铺满整个屏幕

关键点:

在GridView的adapter中对item高度进行计算,然后再设置。

核心代码:

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;

        if(convertView==null){
            convertView= LayoutInflater.from(context).inflate(R.layout.item_shmain ,parent ,false);
            holder=new ViewHolder();

            holder.itemIV= (ImageView) convertView.findViewById(R.id.iv_item);
            holder.itemTV= (TextView) convertView.findViewById(R.id.tv_item);

            convertView.setTag(holder);
        }else {
            holder= (ViewHolder) convertView.getTag();
        }

        holder.itemIV.setBackgroundResource(images[position]);
        holder.itemTV.setText(names[position]);

        LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                (CommonUtil.getDeviceHeight(context)-CommonUtil.getBarHeight(context))/3);
        convertView.setLayoutParams(lp);

        return convertView;
    }

这里设置高度是屏幕的高度减掉标题栏的高度,然后除以gridview的行数(这里直接写死 了3).通过动态设置adapter的convertview的高度就实现了GridView填充整个屏幕。

最后贴出所有代码记录:

public class MainActivity extends AppCompatActivity {

    private GridView mGridView;

    private String[] itemName={"扫码安装" ,"扫码维修" ,"设备数据查询" ,"我的工作记录" ,"关于我们" ,"设置"};
    private int[] imgId={R.drawable.icon_sh_1 ,R.drawable.icon_sh_2 ,R.drawable.icon_sh_3 ,
            R.drawable.icon_sh_4 ,R.drawable.icon_sh_5 ,R.drawable.icon_sh_6};

    private SHGridAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        mGridView= (GridView) findViewById(R.id.gv_sh);

        mAdapter=new SHGridAdapter(this,itemName,imgId);
        mGridView.setAdapter(mAdapter);
    }
public class SHGridAdapter extends BaseAdapter{

    private Context context;

    private String[] names;
    private int[] images;

    public SHGridAdapter(Context context, String[] names, int[] images) {
        this.context = context;
        this.names = names;
        this.images = images;
    }

    @Override
    public int getCount() {
        return names.length;
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        ViewHolder holder;

        if(convertView==null){
            convertView= LayoutInflater.from(context).inflate(R.layout.item_shmain ,parent ,false);
            holder=new ViewHolder();

            holder.itemIV= (ImageView) convertView.findViewById(R.id.iv_item);
            holder.itemTV= (TextView) convertView.findViewById(R.id.tv_item);

            convertView.setTag(holder);
        }else {
            holder= (ViewHolder) convertView.getTag();
        }

        holder.itemIV.setBackgroundResource(images[position]);
        holder.itemTV.setText(names[position]);

        LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                (CommonUtil.getDeviceHeight(context)-CommonUtil.getBarHeight(context))/3);
        convertView.setLayoutParams(lp);

        return convertView;
    }

    class ViewHolder{

        private ImageView itemIV;
        private TextView itemTV;

    }

}
public class CommonUtil {

    public static int getDeviceHeight(Context context){

        WindowManager wm= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

        return wm.getDefaultDisplay().getHeight();

    }

    /**
     * 获取状态栏高度
     */
    public static int getBarHeight(Context context){
        Class<?> c = null;
        Object obj = null;
        Field field = null;
        int x = 0, sbar = 38;//默认为38,貌似大部分是这样的

        try {
            c = Class.forName("com.android.internal.R$dimen");
            obj = c.newInstance();
            field = c.getField("status_bar_height");
            x = Integer.parseInt(field.get(obj).toString());
            sbar = context.getResources().getDimensionPixelSize(x);

        } catch (Exception e1) {
            e1.printStackTrace();
        }
        return sbar;
    }

}
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:gravity="center"
    android:background="@drawable/bg_gridview"
    android:paddingTop="30dp"
    android:paddingBottom="30dp"
    >

    <ImageView
        android:id="@+id/iv_item"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:layout_centerHorizontal="true"
        android:background="@drawable/icon_sh_1"/>

    <TextView
        android:id="@+id/tv_item"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="扫码安装"
        android:gravity="center_horizontal"
        android:textSize="17sp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        />
</LinearLayout>

这里每个gridview的边框效果是通过一个背景实现的(其实有缺陷,部分地方有重复)

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

    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <stroke android:width="1.0px"
                android:color="#e12121"/>
            <gradient android:angle="270.0"
                android:endColor="#ffe8ecef"
                android:startColor="#ffe8ecef"/>
        </shape>
    </item>

    <item android:state_focused="true">
        <shape android:shape="rectangle">
            <shape android:shape="rectangle">
                <stroke android:width="1.0px"
                    android:color="#e12121"/>
                <gradient android:angle="270.0"
                    android:endColor="#ffe8ecef"
                    android:startColor="#ffe8ecef"/>
            </shape>
        </shape>
    </item>

    <item>
        <shape android:shape="rectangle">
        <gradient android:angle="270.0"
            android:endColor="#ffffffff"
            android:startColor="#ffffffff" />
        <stroke android:width="1.0px"
            android:color="#e12121" />
    </shape>
    </item>

</selector>

ok,代码很功能都很基础。感觉有用的朋友可以留言支持,一起进步!

时间: 2024-10-21 09:18:49

Android GridView无法填充Activity的解决办法的相关文章

android 开发中遇到错误及解决办法总结

新手总结的开发中所遇到错误及解决办法,如有不对,欢迎指正,如有更好的解决办法,也请不吝赐教. 一.dialog.show()引起的android.view.WindowManager$BadTokenException错误 错误日志 android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running?

配置Android环境遇到的问题及解决办法

配置Android环境遇到的问题及解决办法: 1 环境安装地址 http://pan.baidu.com/s/1jGzNzyI 2 其他: 2.1 安装 2.1.1 安装JDK,JRE 成功安装之后,进行测试是否真的成功安装,点击[开始]----[运行]----输入 CMD,在命令提示符里面输入"Java -version"并按回车键,出现版本号则安装成功. 2.1.2 安装Adb 2.1.3 打开Eclipse 2.2 配置环境变量: 2.2.1 配置JAVA环境变量 (见下方2.2

android.os.BadParcelableException: ClassNotFoundException when unmarshalling:解决办法

例如在用AlarmManager的时候 1 AlarmManager alarmMgr = (AlarmManager) mContext 2 .getSystemService(Context.ALARM_SERVICE); 3 Intent intent = new Intent(ALARM_ALERT); 4 // intent.setExtrasClassLoader(DBTask.class.getClassLoader()); 5 Bundle mBundle=new Bundle(

android sqlite3程序不存在的解决办法(转)

在android开发中,在使用命令行操作数据库sqlite时,有时候会遇到sqlite3 not found的问题.这是因为你的手机没有安装sqlite3程序.解决办法如下(两种办法结合起来解释的更清楚!!!): 方法1: sqlite3 not found的解决办法(转) 在Android开发方面,我是小白,起步没多久.最近用到了sqlite本地缓存数据,我希望像mysql一样通过命令行查看建立的表以及表中的数据,于是用adb shell进入,敲入sqlite3,提示 sqlite3: not

Eclipse下ADB报错:Android ADB server didn&#39;t ACK,解决办法

转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9401981 ADB server didn't ACK 这个问题会困恼很多的新手朋友,我以前刚开始做Android的时候也遇到过这个问题,不过自己百度,google啥的,也不知道怎么就给解决了,看到群里很多新手朋友都会问这个问题,说实话我也没有一个解决这个问题的终极方法(百试百灵的那种,哈哈),自己没遇到也没有认真的去对待他,今天,就是在今天,我打开Eclipse连上手机,准备调试程

Android开发遇到的异常及解决办法

Android开发遇到的错误及解决方法1. Unable to resolve target 'android-7' 解决方案: 修改工程目录下的default.properties文件里的内容target=android-7改成target=android-12(或者其他版本)就可以了,最好用txt打开,然后修改之后保存,运行就可以了. 原代码如下: # This file is automatically generated by Android Tools.# Do not modify

兔子--Android Support v4包丢失的解决办法

在开发中,Android Support v4包丢失的解决办法: Project->properties->Java Build Path->Libraries->Add External Jars 中加入sdk目录下的extras/android/support/v4/android-support-v4.jar (如果找不到,则需要用sdk manager下载android support package)

PendingIntent.getActivity()启动不起来Activity的解决办法

今天遇到一个奇怪的bug,PendingIntent.getActivity()在小米手机上面不起作用,在别的手机没有问题,估计是小米侵犯了rom的原因.源代码这个方法介绍如下: /** * Retrieve a PendingIntent that will start a new activity, like calling * {@link Context#startActivity(Intent) Context.startActivity(Intent)}. * Note that t

Android 开发遇到的问题及解决办法

Failed to resolve: com.android.support:appcompat-v7:23.4.0 问题解决办法: 1.在Android SDK Manager中找到对应的SDK版本,并且选中Extras中的Android Support Repository和Google Repository安装包. 2.选择 Sync Project with Gradle Files,重新编译,然后启动即可解决. adb not responding if youd like to re