Grid View

Grid View

GridView是一个ViewGroup,它将所包含的组件显示在一个可滚动的二维网格里。网格中的组件会被自动插入到一个使用ListAdapter的布局中。、

关于如何使用适配器(adapter)动态地插入视图,请查看Building Layouts with an Adapter。

示例:

在本教程中,你将创建一个网格形式的图像缩略图。当选择其中某一项时,将显示出图像的位置。

1、创建一个新的工程,名称为HelloGridView。

2、找一些你喜欢的照片或者图片来使用。将保存到工程的 res/drawable 目录中。

3、打开 res/layout/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"
/>

GridView将充满整个屏幕。有些属性从字面意思就可以理解是干什么的了。关于有效属性的更多信息,请参考GridView。

4、打开HelloGridView.java文件,把下面的代码添加到onCreate()方法里:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.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(HelloGridView.this, "" + position, Toast.LENGTH_SHORT).show();
        }
    });
}

在设置了布局为main.xml布局之后,使用findViewById(int)从布局中获得了GridView。setAdapter()方法随后设置一个自定义的适配器(ImageAdapter)作为所有项目将显示在该网格中源。在下一步中,我们将创建ImageAdapter。

为了响应网格中组件被点击这一事件,一个新AdapterView.OnItemClickListener被作为参数传递给setOnItemClickListener()方法。这种匿名的实例定义了onItemClick()回调方法来显示所选择的物品的索引位置(从零开始的)。在现实应用场景中,这个位置可以被用来为其他一些处理任务获得完整的图像。

5、创建一个新的类,名称为ImageAdapter,继承自BaseAdapter:

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.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7,
            R.drawable.sample_0, R.drawable.sample_1,
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7,
            R.drawable.sample_0, R.drawable.sample_1,
            R.drawable.sample_2, R.drawable.sample_3,
            R.drawable.sample_4, R.drawable.sample_5,
            R.drawable.sample_6, R.drawable.sample_7
    };
}

首先,实现了一些需要从BaseAdapter继承的方法。构造函数和getCount()都是不言而喻的(必须实现)。通常,getItem(int)应该返回适配器中特定位置的那个实际的对象,但在这个例子中它忽略了。同样,getItemId(int)应该返回的组件的行号,这里也不需要。

第一个必要的方法是getView()。这个方法为每一个图像创建一个新的视图,添加到ImageAdapter里。当这个方法被调用时,一个视图被传递进来。这通常是一个可回收的对象(至少在这之后被称为一次)。所以,有一个检查,此对象是否为null。如果它是空的,一个ImageView就被实例化,并且配置图像表示所需要的属性:

  • 使用setLayoutParams(ViewGroup.LayoutParams)为视图设置高度和宽度。这样做保证了,不论大小如何,每个图像都调整大小和剪裁来适应这样的尺寸。
  • 使用setScaleType(ImageView.ScaleType)来声明图片应该居中显示(如果需要的话)。
  • 使用setPadding(int,int,int,int)来定义为四边的空白填充。(注意,如果图像有不同的纵横比,然后少会导致更多的填充物裁剪图像如果它不匹配维度给ImageView。)

如果传递给getView()的视图不是null,那么本地ImageView将使用一个可回收的视图对象来进行初始化。

在getView()方法的最后,整型变量position作为参数传递进来,用于从mThumbIds数组中选择一个图像,它设置为ImageView的图像资源。

剩下的是定义可绘资源的mThumbIds数组。

6、运行程序。

试着通过调整GridView和ImageView元素的属性,来验证它们有何行为。例如,不使用setLayoutParams(ViewGroup.LayoutParams),而使用setAdjustViewBounds(boolean)。 

转载于:https://my.oschina.net/allenyao/blog/108330

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值