GridView的使用是很简单的,API Demo中有例子,但是要实现复杂的GridView,就需要自定义了。

今天我们要实现如下的效果:

先说它的布局,它是由gridview和grid_item两部分组成。

main.xml

<?xml version="1.0" encoding="utf-8"?>

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

android:id="@+id/gridview"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:columnWidth="90dp"

android:numColumns="auto_fit"

android:verticalSpacing="10dp"

android:horizontalSpacing="10dp"

android:stretchMode="columnWidth"

android:gravity="center"

/>

grid_item.xml

<?xml version="1.0" encoding="utf-8"?>

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

android:layout_width="fill_parent" android:layout_height="fill_parent"

android:orientation="vertical"

android:layout_marginTop="5dp"

>

<ImageView android:id="@+id/image" android:layout_width="80dip"

android:layout_height="80dip" android:layout_gravity="center_horizontal">

</ImageView>

<TextView android:id="@+id/title" android:layout_width="wrap_content"

android:layout_height="wrap_content" android:layout_gravity="left"

android:textSize="16dip"

android:gravity="left">

</TextView>

<TextView android:id="@+id/description" android:layout_width="wrap_content"

android:layout_height="wrap_content" android:layout_gravity="left"

android:textColor="#938192"

android:textSize="13dip"

android:gravity="left"

>

</TextView>

</LinearLayout>

接下来我们要新写一个继承自BaseAdapter类的Adapter类,在这里做grid item的适配。

由于我们每个grid item是一个图片加两个文本框,就需要有一个容器类:

class GridItem

{

private String title;

private int imageId;

private String description;

public GridItem()

{

super();

}

public GridItem(String title, int imageId,String time)

{

super();

this.title = title;

this.imageId = imageId;

this.description = time;

}

public String getTime( )

{

return description;

}

public String getTitle()

{

return title;

}

public int getImageId()

{

return imageId;

}

}

再来个Viewholder

static class ViewHolder

{

public ImageView image;

public TextView title;

public TextView time;

}

接下来的Adapter的实现就顺理成章了。GridItemAdapter

import java.util.ArrayList;

import java.util.List;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.TextView;

public class GridItemAdapter extends BaseAdapter

{

private LayoutInflater inflater;

private List<GridItem> gridItemList;

public GridItemAdapter(String[] titles, int[] images,String[] description, Context context)

{

super();

gridItemList = new ArrayList<GridItem>();

inflater = LayoutInflater.from(context);

for (int i = 0; i < images.length; i++)

{

GridItem picture = new GridItem(titles[i], images[i],description[i]);

gridItemList.add(picture);

}

}

@Override

public int getCount( )

{

if (null != gridItemList)

{

return gridItemList.size();

}

else

{

return 0;

}

}

@Override

public Object getItem( int position )

{

return gridItemList.get(position);

}

@Override

public long getItemId( int position )

{

return position;

}

@Override

public View getView( int position, View convertView, ViewGroup parent )

{

ViewHolder viewHolder;

if (convertView == null)

{

convertView = inflater.inflate(R.layout.grid_item, null);

viewHolder = new ViewHolder();

viewHolder.title = (TextView) convertView.findViewById(R.id.title);

viewHolder.image = (ImageView) convertView.findViewById(R.id.image);

viewHolder.time = (TextView) convertView.findViewById(R.id.description);

convertView.setTag(viewHolder);

} else

{

viewHolder = (ViewHolder) convertView.getTag();

}

viewHolder.title.setText(gridItemList.get(position).getTitle());

viewHolder.time.setText(gridItemList.get(position).getTime());

viewHolder.image.setImageResource(gridItemList.get(position).getImageId());

return convertView;

}

在activity中调用如下:

package com.linc.gridview;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.GridView;

import android.widget.Toast;

import android.widget.AdapterView.OnItemClickListener;

public class CustomGridViewActivity extends Activity {

private GridView gridView;

//图片的第一行文字

private String[] titles = new String[]

{ "美女卷珠帘", "美女回眸", "美女很有趣", "美女醉酒", "美女微笑", "美女如脱兔", "美女柳叶弯眉"};

//图片的第二行文字

private String[] description = new String[]

{ "啦啦啦", "嘎嘎嘎", "哇哇哇", "喵喵喵", "刚刚刚", "当当当", "咔咔咔"};

//图片ID数组

private int[] images = {

R.drawable.five, R.drawable.sample_7,

R.drawable.one, R.drawable.three,

R.drawable.sample_3, R.drawable.sample_7,

R.drawable.sample_0 };

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

gridView = (GridView) findViewById(R.id.gridview);

GridItemAdapter adapter = new GridItemAdapter(titles, images,description,this);

gridView.setAdapter(adapter);

gridView.setOnItemClickListener(new OnItemClickListener()

{

@Override

public void onItemClick(AdapterView<?> parent, View v, int position, long id)

{

Toast.makeText(CustomGridViewActivity.this, "item" + (position+1), Toast.LENGTH_SHORT).show();

}

});

}

}

这样就可以了,

此实现与ListView类似,熟练使用会带来很好的用户体验。

GridView实现一个图片加多个文本框的更多相关文章

  1. ASP.NET中页面加载时文本框(texbox控件)内有文字获得焦点时文字消失

    代码如下: <asp:TextBox ID="TextBox1" runat="server" Height="26px" MaxLe ...

  2. Enterprise Library +Caliburn.Micro+WPF CM框架下使用企业库验证,验证某一个属性,整个页面的文本框都变红的原因

    我用的是CM这个框架做的WPF,在用企业库的验证的时候,我用标签的方式给一个属性加了不能为空的验证,但整个页面的所有控件的外面框都变红了.原因是CM框架的绑定方式是直接X:Name="你的属 ...

  3. wxpython图形化界面编程(一):添加菜单,设置图片大小,添加文本框等,并简要布局

    #-*-encoding:utf-8-*-import wx def loadframe(): app = wx.App() mywindow = myframe() mywindow.Show() ...

  4. 第七十八篇:写一个按需展示的文本框和按钮(使用ref)

    好家伙, 我们又又又来了一个客户 用户说: 我想我的页面上有一个搜索框, 当我不需要他的时候,它就是一个按钮 当我想要搜索的时候,我就点一下它, 然后按钮消失,搜索框出现, 当我在浏览其他东西时,这个 ...

  5. 一起写一个Android图片加载框架

    本文会从内部原理到具体实现来详细介绍如何开发一个简洁而实用的Android图片加载缓存框架,并在内存占用与加载图片所需时间这两个方面与主流图片加载框架之一Universal Image Loader做 ...

  6. 关于图片加载非常爽的一个三方控件 fresco,一个三fresco

    Hi  EveryBody 今天来玩一个非常爽的控件 fresco 到底有多爽呢 接着看就知道了 首先 来看看fresco 是个神马东西 https://github.com/facebook/fre ...

  7. 图片加载框架之ImageLoader

    Android开发中,多少会接触到异步加载图片,或者加载大量图片的问题,而加载图片我们常常会遇到许多的问题,比如说图片的错乱,OOM等问题,对于这些问题解决起来会比较吃力,比较著名的就是Univers ...

  8. 给图片加ALT属性是个什么意思?有什么优点呢

    使用百度统计的seo建议当中一条图片ALT信息"存在没有alt信息的img标签"扣分较多.站点图片中加入ALT对seo有什么优点呢?这是非常多初学seo的朋友们都须要询问的问题.a ...

  9. Android中常见的图片加载框架

    图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...

随机推荐

  1. Ajax相同url的请求,IE缓存问题

    最近做一个小项目,其中的一个页面如下,需要实现异步改变“是否推荐”的状态. 请求的代码如下: $.get("/Contorller/Edit", { id: id }, funct ...

  2. C++中的异常处理(二)

    C++中的异常处理(二) 标签: c++C++异常处理 2012-11-24 20:56 1713人阅读 评论(2) 收藏 举报  分类: C++编程语言(24)  版权声明:本文为博主原创文章,未经 ...

  3. form表单那点事儿(下) 进阶篇

    form表单那点事儿(下) 进阶篇 上一篇主要温习了一下form表单的属性和表单元素,这一片主要讲解用JavaScript如何操作form. 目录: 表单操作 取值 赋值 重置 校验 提交 技巧 不提 ...

  4. 模板插件aTpl.js新增功能

    摘要: aTpl.js是一款模板插件,该插件支持ie5+,chrome等浏览器以及移动端浏览器,支持for和if语法,以及表达式.最近对aTpl.js模板插件增加了新的功能,支持字符串模板,同时增加了 ...

  5. We are 歪果仁带你灰

    We are 歪果仁带你灰 我叫赖彦谕 不爱什么诗和远方 只爱饭桌上的一菜一肉一杯酒 真的很希望有一天我可以成为那个对待学习像对待美食一样的人类 让自己沉浸在美食和知识的海洋中无法自拔 我也对未来的软 ...

  6. 关于windows程序的学习及思考系列之一

    1.窗口类的注册 a.windows程序中最简单的就是创建一个简单的窗口,而窗口程序的创建是基于窗口类的,窗口类决定了处理窗口消息的过程函数. b.一个窗口类可以用于创建多个窗口,也就是说窗口是窗口类 ...

  7. phpmyadmin #1045 #2002 无法登录 MySQL 服务器的解决方

    1.首先说下phpmyadmin的安装 a.解压放到网站的某个目录下,如mydbb.将config.sample.inc.php复制成config.inc.php 2.#2002 无法登录 MySQL ...

  8. MySQL目录

    MySQL的学习总结目录 Mysql5.7安装及配置 教你如何3分钟玩转MYSQL MySQL使用详解--根据个人学习总结 Mysql增删改 Mysql_以案例为基准之查询 MySQL之扩展(触发器, ...

  9. 【leetcode】Best Time to Buy and Sell Stock II

    Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price of a ...

  10. php对象引用和析构函数的关系

    在php中构造函数和析构函数都属于魔术方法,比如构造函数在某一个类中,当这个类被实例化的时候就会自动调用,而析构函数是在这个类的对象被销毁的时候自动调用,默认情况下是在程序执行结束时自动调用. 如果我 ...