[Android学习系列13]关于Gridview的一些事

用mvc的思想去理解 数据源,adapter,xxxView的关系,写代码就轻松多了

先写一个简单的gridview

第一版:只有图片

xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingTop="10dp"
tools:context=".ActivityMain" >

<GridView
android:id="@+id/gridView1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:numColumns="3"
android:columnWidth="90dp"
android:horizontalSpacing="10dp"
android:verticalSpacing="10dp"
android:stretchMode="spacingWidth"
>
</GridView>

</LinearLayout>

java代码

public class ActivityMain extends Activity {

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

GridView gridView = (GridView)findViewById(R.id.gridView1);
gridView.setAdapter( new MyGridviewAdapter(this) );

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

class MyGridviewAdapter extends BaseAdapter {

Context context; //传入ActivityMain给adapter,创建imageview的时候要用到

//做一个数组存图表的id
int []imagesId = {R.drawable.icon1,R.drawable.icon2,R.drawable.icon3,
R.drawable.icon4,R.drawable.icon5,R.drawable.icon6,
R.drawable.icon7,R.drawable.icon8,R.drawable.icon9};

MyGridviewAdapter(Context con) {
this.context = con;
}

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

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
//这里重头戏,既然要getview,就返回一个图标的imageview给它

ImageView imgview = new ImageView(context);
imgview.setImageResource( imagesId[position] );

return imgview;

}

}

}

第二版:只有图片

上面的有点问题,看其他人的代码,会对convertView做一个null判断,避免重复创建,节约资源

改进

修改getview方法:

        public View getView(int position, View convertView, ViewGroup parent) {
//这里重头戏,既然要getview,就返回一个图标的imageview给它

//ImageView imgview = new ImageView(context);
//imgview.setImageResource( imagesId[position] );

ImageView imgview;
if( convertView == null )
{
imgview = new ImageView(context);
imgview.setImageResource( imagesId[position] );
}
else
{
imgview = (ImageView)convertView;
}

return imgview;

}

长这样:

第三版:  图片 + 文字

首先自定义一个grid_one_item.xml,里面混和了图片和文字

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

<ImageView
android:id="@+id/grid_item_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>

<TextView
android:id="@+id/grid_item_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"/>

</LinearLayout>


java代码 重点理解适配器部分

public class ActivityMain extends Activity {

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

GridView gridView = (GridView)findViewById(R.id.gridView1);
gridView.setAdapter( new MyGridviewAdapter(this) );

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

//拥有textview的string内容 和imageview的资源id
class IconInfo {
String text;
int imageid;
}

//一个混合了textview和imageview的类
class MixedView {
ImageView imgview;
TextView textview;
}

class MyGridviewAdapter extends BaseAdapter {

Context context; //传入ActivityMain给adapter,创建view的时候要用到
LayoutInflater inflater;
List<IconInfo> iconInfoList;

//做一个数组存图表的id
int []imagesId = {R.drawable.icon1,R.drawable.icon2,R.drawable.icon3,
R.drawable.icon4,R.drawable.icon5,R.drawable.icon6,
R.drawable.icon7,R.drawable.icon8,R.drawable.icon9};
String []titles = {"标题1","标题2","标题3","标题4","标题5","标题6","标题7","标题8","标题9"};

MyGridviewAdapter(Context con) {

this.context = con;
inflater = LayoutInflater.from(context);

iconInfoList = new ArrayList<IconInfo>();
for(int i=0; i<imagesId.length; i++)
{
IconInfo iconInfo = new IconInfo();
iconInfo.imageid = imagesId[i];
iconInfo.text = titles[i];
iconInfoList.add(iconInfo);
}

}

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

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

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

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

MixedView mixedView;
//用setTag() getTag() 来节约findViewById所消耗的性能
if( convertView == null )
{
convertView = inflater.inflate(R.layout.grid_one_item, null);
mixedView = new MixedView();
mixedView.imgview = (ImageView)convertView.findViewById(R.id.grid_item_image);
mixedView.textview = (TextView)convertView.findViewById(R.id.grid_item_text);
convertView.setTag(mixedView);
}
else
{
mixedView = (MixedView)convertView.getTag();
}

mixedView.imgview.setImageResource( iconInfoList.get(position).imageid );
mixedView.textview.setText( iconInfoList.get(position).text );

return convertView;

}

}

}


View
Code

个人粗俗地理解这两句(错了求指正):

convertView.setTag(mixedView);  //  为convertView设定一个  
指向mixedView的引用

mixedView= (MixedView) convertView.getTag();  //
 把convertView所引用的对象赋给mixedView,
 也就是说,convertView和mixedView引用的是同一个内存里的东西

//所以getview时
 我们做处理的是mixedView,还可以返回convertView,因为他们引用的是同一个东西啊

最后长这样:

android:stretchMode 参考下图

更多参考:

http://liangruijun.blog.51cto.com/3061169/647355

http://www.cnblogs.com/topcoderliu/archive/2011/06/07/2074419.html

[Android学习系列13]关于Gridview的一些事,布布扣,bubuko.com

时间: 2024-08-02 07:03:14

[Android学习系列13]关于Gridview的一些事的相关文章

[Android学习系列17]Content Provider的一些事

参考: android Content Provider详解一 android Content Provider详解二 android Content Provider详解三 android Content Provider详解四 android Content Provider详解五 android Content Provider详解六 android Content Provider详解七-实现ContentProvider类 android Content Provider详解八-实现C

[Android学习系列20]图形图像的一些事

参考: android图形系统详解一:Canvas android图形系统详解二:Drawables android图形系统详解三:形状Drawable和九宫格 android图形系统详解四:控制硬加速 android图形系统详解五:Android绘制模式 android图形系统详解六:View layer[Android学习系列20]图形图像的一些事,码迷,mamicode.com

Android学习系列(17)--App列表之圆角ListView(续)

http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html 本来这篇文章想并到上篇Android学习系列(16)--App列表之圆角ListView中的,但是若是如此就让大家错过一篇新的好的文章,着实可惜.上篇中我们使用shape,corners,gradient实现了一个渐变的圆角效果,但是在完文之后的实践中,我发现有时效果不甚满意,选中和放手的事件监听没有去正确的判断,然后渐变效果也比较单一,性能也觉得不是很快

Android学习系列(39)--Android主题和样式之系统篇(上)

Android学习系列(39)--Android主题和样式之系统篇(上) [基于最新的Android4.4的源码分析] 每家公司或者每个移动团队无不想开发出一套自己的UI框架,融入自己的设计和特性,这必然会去修改android的ui.所以,学习和理解android的UI设计是最基础和非常有必要的.android ui设计最重要的就是主题和样式. 1.位置在Android的frameworks/base/core/res/res/values目录下有一下几个文件: 1 2 3 4 themes.x

Android学习系列(7)--App轮询服务器消息

这篇文章是android开发人员的必备知识. 1.轮询服务器     一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务.    其中需要注意轮询的频率设置,要在需求和性能中平衡. 2.独立进程     无论程序是否正在运行,我们都要能通知到客户,我们需要一个独立进程的后台服务.     我们需要一个独立进程的后台服务.     在AndroidManifest.xml中注册Service时,有一个android:process属性,如果这个属性以

Android学习系列(15)--App列表之游标ListView(索引ListView)

游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1.游标(Fast scroll thumb)      就是右边的那个拖动的方块,这个非常的简单: 1 2 3 4 5 <ListView     android:id="@+id/tweaked_list"     android:layout_width="fill_pa

Android学习系列(23)--App主界面实现

在上篇文章<Android学习系列(22)--App主界面比较>中我们浅略的分析了几个主界面布局,选了一个最大众化的经典布局.今天我们就这个经典布局,用代码具体的实现它. 1.预览图先看下最终的界面设计图:    上面顶部是一个9patch背景图片+标题文字:下面底部是5个tab标签,表示应用的5大模块.中间内容部分则是各个模块的具体内容,可以再分类,或者直接显示内容. 2.准备素材按照上篇文章的界面,我们需要事先提供两大方面的素材:顶部+底部.顶部的素材非常简单,最重要的是背景(9patch

[Android学习系列18]线程,进程,异步的一些事

解决NetworkOnMainThreadException http://www.aitinan.com/4387.html 参考: android进程与线程详解一:进程 android进程与线程详解二:线程 android进程与线程详解三:AsyncTask android进程与线程详解四:线程安全和进程间通信 [Android学习系列18]线程,进程,异步的一些事,码迷,mamicode.com

[Android学习系列14]聊天通信的实现

说不定以后用得上 基于XMPP http://blog.csdn.net/lnb333666/article/details/7471292 http://www.oschina.net/code/snippet_150934_11012 [Android学习系列14]聊天通信的实现,码迷,mamicode.com