首页 > 代码库 > Android百日程序:GridView实现相册效果

Android百日程序:GridView实现相册效果

本章使用GridView控件来做一个相册效果。

图片效果如下:


响应点击事件,点击的时候提示是当前第几章图片,从左到右,从上到下。


点击了第一张图片,显示了1.

步骤:

一 新建项目,然后把图片资源拷贝到res/drawable/文件夹中,如果没有drawable这个文件夹也不要紧,可以直接新建这个文件夹,然后在Eclipse项目中刷新,就会在项目中显示出来了

二 然后在Layout的界面xml文件activity_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="match_parent"
    android:layout_height="match_parent"
    android:columnWidth="90dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
/>
没什么特别的,就是设置好行宽,然后自动排好行数numColumns="auto_fit",这个好像是Android自动排列的。

三 activity_main.xml对应的java文件MainActivity.java输入逻辑代码,主要是修改onCreate这个函数就可以了,其他就默认可以了,不用管:

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

		GridView gridview = (GridView) findViewById(R.id.gridview);
		gridview.setAdapter(new ImageAdapter(this));

		gridview.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View v,
					int position, long id) {
				Toast.makeText(MainActivity.this, "" + (position+1),
						Toast.LENGTH_SHORT).show();
			}
		});
	}

主要是设置好监听GridView对象的ItemClickListener就可以了。Toast可以理解为一个轻量的提示对话框,就是上图中显示1的一个小对话框,显示大概1秒多就自动消失。

小技巧:

不知道对象属于那些头文件?例如OnItemClickListener是属于什么文件库啊?

这个有时候是个头疼的问题,尤其是使用VC写C++的时候,需要自己动手去查,头疼的是,查到了这个函数,或者类之后,居然没提示需要include什么头文件,不过到了Java,似乎那都不是事了,一个快捷键搞定了:ctrl+shift+o;那么就会全自动包括所有需要的库了。


四 之后创建一个Java类,放在MainActivity.java一个目录下,然后添加代码:

package su.gridview.hellogridview;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;

public class ImageAdapter extends BaseAdapter {
	private Context mContext;

	public ImageAdapter(Context c) {
		mContext = c;
	}

	public int getCount() {
		return mThumbIds.length;
	}

	public Object getItem(int position) {
		return null;
	}

	public long getItemId(int position) {
		return 0;
	}

	// create a new ImageView for each item referenced by the Adapter
	public View getView(int position, View convertView, ViewGroup parent) {
		ImageView imageView;
		if (convertView == null) { // if it's not recycled, initialize some
									// attributes
			imageView = new ImageView(mContext);
			imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
			imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
			imageView.setPadding(8, 8, 8, 8);
		} else {
			imageView = (ImageView) convertView;
		}

		imageView.setImageResource(mThumbIds[position]);
		return imageView;
	}

	// references to our images
	private Integer[] mThumbIds = { R.drawable.x0, R.drawable.x1,
			R.drawable.x2, R.drawable.x3, R.drawable.x4, R.drawable.x5,
			R.drawable.x10, R.drawable.x9, R.drawable.x8, R.drawable.x7,
			R.drawable.x6, R.drawable.x5, R.drawable.x11, R.drawable.x20,
			R.drawable.x13, R.drawable.x14, R.drawable.x15, R.drawable.x16,
			R.drawable.x17, R.drawable.x18, R.drawable.x19, R.drawable.x20 };
}
本例没用的函数都是因为必须需要复写BaseAdapter类的。

主要使用了getCount和getView这两个函数。按照他的样式实现就可以了,具体的低层工作就是由Adapter类自动调用的,调用getCount,Adapter就知道有多少资源对象需要显示了,调用getView就可以把图片资源显示出来,其中传入convertView是为了加速,复用之前用过的View。

这个是我的理解,更加详细的原理还有待有空参考一下源代码吧。

参考资料:http://developer.android.com/guide/topics/ui/layout/gridview.html

第二章完成,感觉Android写程序实在是太方便了,难怪Android大行其道啊,对比一个DirectX这些API的用法,简直就是傻瓜式的。尤其令我想起之前使用Direct2D,微软真的傻了,都什么年头了,居然还出Direct2D这么难用的API。呵呵,别说我黑微软;最近听说VC居然要支持Android了,感觉微软是低下了高贵的头了,支持了竞争对手的东西;同时也想赶上Android的步伐,不是牺牲色相啊。战略需要,是应该低下头的。


Android百日程序:GridView实现相册效果