首页 技术 正文
技术 2022年11月15日
0 收藏 607 点赞 2,859 浏览 5146 个字

 在使用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;
} }}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,494
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,132
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,295