在使用GridView时我们知道,列数是可以通过设计时的属性来设置的,列的宽度则是根据列数和GridView的宽度计算出来的。但是有些时候我们想实现列数是动态改变的效果,即列的宽度保持某个值,列的数量是可变的,我们可通过获取屏幕宽度并除以项目宽度来处理。请看下面的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); GridView lvnote = (GridView)findViewById(R.id.gridView1);
// The item width is about 200,项目宽度大概200像素
colnum = (int) (((getResources().getDisplayMetrics().widthPixels )) / );
lvnote.setNumColumns(colnum); }

 但是由于不同的Android设备可能有不同的宽度,项目宽度乘以获得的列数所得到的总宽度并不能填充整个屏幕的宽度,而给用户带来不好的用户体验,甚至我们可能还需要使行高和列宽保持一定的比例,那么如何动态调整项目的宽度和高度呢?

  我们此处是通过写一个自己的Adapter类,并改写其中的getView函数来实现的,getView是用来返回某个GridView项的部局的函数,我们在此处手动生成需要的view并设置此view的宽度和高度,最后将此view返回。

  注:使用此方法时,项目中的内容可能也需要手动去填充,请再研究

  相关文件及代码如下:

  主窗体只有一个GridView,部局文件代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <GridView
android:id="@+id/gridView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:gravity="center_horizontal"
android:numColumns="" > </GridView> </RelativeLayout>

GridView项所使用的部局文件只有一个TextView,命名为note_item,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/tvNote"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" /> </LinearLayout>

 Activity类的实现代码如下:

package com.example.apptest;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener; public class MainActivity extends Activity {
GridView lvnote;
ArrayList<HashMap<String, String>> mynotelist = new ArrayList<HashMap<String,String>>();
int colnum = ; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); lvnote = (GridView)findViewById(R.id.gridView1);
// The item width is about 200,项目宽度大概200像素
colnum = (int) (((getResources().getDisplayMetrics().widthPixels )) / );
lvnote.setNumColumns(colnum); HashMap<String, String> mapitem1 = new HashMap<String, String>();
mapitem1.put("note", "Hello1...");
mapitem1.put("noteid", "");
mynotelist.add(mapitem1); HashMap<String, String> mapitem2 = new HashMap<String, String>();
mapitem2.put("note", "Hello2...");
mapitem2.put("noteid", "");
mynotelist.add(mapitem2); HashMap<String, String> mapitem3 = new HashMap<String, String>();
mapitem3.put("note", "Hello3...");
mapitem3.put("noteid", "");
mynotelist.add(mapitem3); HashMap<String, String> mapitem4 = new HashMap<String, String>();
mapitem4.put("note", "Hello4...");
mapitem4.put("noteid", "");
mynotelist.add(mapitem4); HashMap<String, String> mapitem5 = new HashMap<String, String>();
mapitem5.put("note", "Hello5...");
mapitem5.put("noteid", "");
mynotelist.add(mapitem5); HashMap<String, String> mapitem6 = new HashMap<String, String>();
mapitem6.put("note", "Hello6...");
mapitem6.put("noteid", "");
mynotelist.add(mapitem6); NoteAdapter adapter = new NoteAdapter(this, mynotelist, R.layout.note_item,
new String[]{"note"},
new int[]{R.id.tvNote}); lvnote.setAdapter(adapter);
} public class NoteAdapter extends SimpleAdapter{
Context context = null; @Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
// Inflate the note_item layout manually, and treat it as the item view
// 重新填充note_item部局,并把它作为项的view返回
convertView = LayoutInflater.from(context).inflate(R.layout.note_item, null);
HashMap<String, String> theMap = (HashMap<String, String>)getItem(position);
TextView txtNote = (TextView)convertView.findViewById(R.id.tvNote);
txtNote.setText(theMap.get("note").toString()); // Calculate the item width by the column number to let total width fill the screen width
// 根据列数计算项目宽度,以使总宽度尽量填充屏幕
int itemWidth = (int)(getResources().getDisplayMetrics().widthPixels - colnum * ) / colnum;
// Calculate the height by your scale rate, I just use itemWidth here
// 下面根据比例计算您的item的高度,此处只是使用itemWidth
int itemHeight = itemWidth; AbsListView.LayoutParams param = new AbsListView.LayoutParams(
itemWidth,
itemHeight);
convertView.setLayoutParams(param); return convertView;
} public NoteAdapter(Context context,
List<? extends Map<String, ?>> data, int resource,
String[] from, int[] to) {
super(context, data, resource, from, to);
this.context = context;
} } }

Android中动态设置GridView的列数、列宽和行高的更多相关文章

  1. Android中动态更新ListView(转)

    在使用ListView时,会遇到当ListView列表滑动到最底端时,添加新的列表项的问题,本文通过代码演示如何动态的添加新的列表项到ListView中.实现步骤:调用ListView的setOnSc ...

  2. Android中如何设置RadioButton在文字的右边,图标在左边

    from:http://blog.csdn.net/sunnyfans/article/details/7901592?utm_source=tuicool&utm_medium=referr ...

  3. Quartz在Spring中动态设置cronExpression (spring设置动态定时任务)

    什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定).      这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户 ...

  4. Android中一个类实现的接口数不能超过七个

    近期一段时间,在开发Android应用程序的过程中,发现Android中一个类实现的接口数超过七个的时候,常常会出现超过第7个之后的接口不能正常使用.

  5. Quartz在Spring中动态设置cronExpression

    什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...

  6. 微信小程序首页index.js获取不到app.js中动态设置的globalData的原因以及解决方法

    前段时间开发了一款微信小程序,运行了也几个月了,在index.js中的onLoad生命周期里获取app.js中onLaunch生命周期中在接口里动态设置的globalData一直没有问题,结果昨天就获 ...

  7. 分别在javascript和JSP中动态设置下拉列表默认值

    一.JavaScript中动态设置select标签中<option>选项的默认值: 比如,要完成下边这个下拉列表的动态显示,并且当进行前后翻页时,下拉列表中的值自动更新为当前页码: 图1 ...

  8. 使用像素单位设置 EXCEL 列宽或行高

    在导出 Excel 的时候, 经常要需要给列设置宽度或给行设置高度, 在使用 NPOI 或 EppPlus 等组件进行操作的时候, 列宽和行高的单位都不是像素, 好像是英寸,具体是啥也说不清. 平常在 ...

  9. DataGridView使用技巧五:自动设定列宽和行高

    一.设定行高和列宽自动调整 设定包括Header和所有单元格的列宽自动调整 //设置包括Header和所有单元格的列宽自动调整 this.dgv_PropDemo.AutoSizeColumnsMod ...

随机推荐

  1. Hadoop学习小结

    还在学校的时候,就知道Hadoop的存在了. 2012年在公司实习的时候,买了<Hadoop权威指南第2版>,大致看了下. 今年,抽空也大致喵了几眼. 最大的感悟就是:光看不做,还是不行. ...

  2. magento getCarriers 分析

    完整的设置订单追踪信息的时候我们可能会用到它.在后台中他在这里设置: 有的时候我们想要设置自己定义的 carrier 比如 顺丰 申通 圆通 ..等等 我们能够先从 magento api 入手分析 ...

  3. 一起talk C栗子吧(第九十 三回:C语言实例--进程间通信之临界资源)

    各位看官们.大家好,前面章回中咱们说的是使用信号和管道进行进程间通信的样例.这一回咱们说的样例是:进程间通信之临界资源.闲话休提,言归正转.让我们一起talk C栗子吧! 我们首先介绍一下,什么是临界 ...

  4. 学习笔记(四):jQuery之动画效果

    1.show()显示效果 语法:show(speed,callback) Number/String,Function speend为动画执行时间,单位为毫秒.也可以为slow"," ...

  5. 利用ServiceWorker实现页面的快速加载和离线访问

    Service workers 本质上充当Web应用程序与浏览器之间的代理服务器,也可以在网络可用时作为浏览器和网络间的代理.它们旨在(除其他之外)使得能够创建有效的离线体验,拦截网络请求并基于网络是 ...

  6. 将exe添加到windows服务中

    mongod --dbpath D:\MongoDB\data --logpath=D:\MongoDB\logs\mongodb.log --install http://www.cnblogs.c ...

  7. win8.1 “服务器运行失败”的解决方法

    平台:win8.1 SP1 问题:安装QQ安全管家又卸载后出现了奇怪的问题,1.在桌面点右键→个性化时,提示“服务器运行失败”.2.右键点击“这台电脑”,选择“属性”时没有反应.3.开始屏幕里随便选择 ...

  8. Library Component Properties的表格如何填写

  9. Docker---(1)Docker 简介

    原文:Docker---(1)Docker 简介 版权声明:欢迎转载,请标明出处,如有问题,欢迎指正!谢谢!微信:w1186355422 https://blog.csdn.net/weixin_39 ...

  10. vue-cli 构建vue项目

    师父说,咱们还是要用vue-cli 去构建前端项目.然后我就开始了 懵逼之旅. 今天上午主要就是搞懂用webpack和vue-cli怎么搭建 运行项目 首先找到了咱们博客园 园友的博客,提供了大概五个 ...