博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android中动态设置GridView的列数、列宽和行高
阅读量:6758 次
发布时间:2019-06-26

本文共 4326 字,大约阅读时间需要 14 分钟。

 在使用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  )) / 200 );        lvnote.setNumColumns(colnum);     }

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

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

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

  相关文件及代码如下:

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

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

 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
> mynotelist = new ArrayList
>(); int colnum = 1; @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 )) / 200 ); lvnote.setNumColumns(colnum); HashMap
mapitem1 = new HashMap
(); mapitem1.put("note", "Hello1..."); mapitem1.put("noteid", "1"); mynotelist.add(mapitem1); HashMap
mapitem2 = new HashMap
(); mapitem2.put("note", "Hello2..."); mapitem2.put("noteid", "2"); mynotelist.add(mapitem2); HashMap
mapitem3 = new HashMap
(); mapitem3.put("note", "Hello3..."); mapitem3.put("noteid", "3"); mynotelist.add(mapitem3); HashMap
mapitem4 = new HashMap
(); mapitem4.put("note", "Hello4..."); mapitem4.put("noteid", "4"); mynotelist.add(mapitem4); HashMap
mapitem5 = new HashMap
(); mapitem5.put("note", "Hello5..."); mapitem5.put("noteid", "5"); mynotelist.add(mapitem5); HashMap
mapitem6 = new HashMap
(); mapitem6.put("note", "Hello6..."); mapitem6.put("noteid", "6"); 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
theMap = (HashMap
)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 * 10) / 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
> data, int resource, String[] from, int[] to) { super(context, data, resource, from, to); this.context = context; } } }

 

转载地址:http://qhfeo.baihongyu.com/

你可能感兴趣的文章
软件测试--关键字
查看>>
nginx知识点
查看>>
字符串操作(字符数统计及字符串反转)
查看>>
递归写法参考
查看>>
【Python】学习笔记八:面向对象
查看>>
单片机中PWM的原理与控制程序
查看>>
RStudio中,出现中文乱码问题的解决方案
查看>>
【SQL 触发器】
查看>>
Kafka server部署配置优化
查看>>
(转) Artificial intelligence, revealed
查看>>
【转】VS项目属性的一些配置项的总结
查看>>
Project、Target、Workspace and Scheme
查看>>
topas top vmstat
查看>>
Linux基本权限学习
查看>>
掌握jQuery插件开发
查看>>
git基本用法
查看>>
Spring Session - 使用Redis存储HttpSession例子
查看>>
如何利用框选工具获取多边形范围?
查看>>
Java读取Excel数据
查看>>
input输入框回车事件响应
查看>>