GridView

grid view是一种viewgroup,它用两个维度显示对象,可以滚动的网格。网格的实体会自动使用ListAdapter插入到布局中。

翻阅一个介绍怎样使用adapter来动态插入views的介绍,请阅读Build Layouts with an Adapter。

例子

在这个教程里面,你会创建一个图片的缩略图的grid。当一个item被选中的时候,一个toast消息会在图片的位置显示出来。

  • 建立一个叫HelloGridView的新的工程。

  • 找一些你想要使用的图片,或者下载一些示例图片。把它们保存在工程的res/drawable目录下。

  • 打开/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="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"
/>

GridView将会填充整个屏幕。这些属性基本都可以见名知道意思。更多的关于有效的属性,请看GridView的参考文档。

  • 打开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布局被加载以后,GridView就可以通过findViewById进行获取了。setAdapter方法设置一个定制的adpter(ImageAdapter)作为所有的要在grid中显示的源。ImageAdapter将在下一步中被创建。

当grid被点击的时候,一个AdapterView.OnItemClickListener对象将会被传递到setOnItemClickListener。这个匿名的实例里面定义了一个显示一个Toast的方法,其中显示了点击的网格的从零开始 的坐标。在实际使用当中,会获取一个全尺寸的图片给其他任务。

  • 创建一个叫做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()方法应该返回一个在adapter指定位置的对象,但是在这例子里面被忽略了。类似的,getItemId()方法应该放回item所在的行的id。但是在这个例子里没有必要。

第一个必须要的方法是getView()。这个方法为每一个图片创建了一个加载的ImageAdapter中的view。当这个方法调用的时候,一个view被传进来,通常是一个循环的对象,(一般也至少被调用一次)。所以有一个检查是否为空的判断。如果为空的话,就实例化一个ImageView并适配一个的属性给要显示的图片。

  • setLayoutParameters(ViewGroup.LayoutParms)设定这个view的高和宽,这保证了无论drawaable的大小,每一个图像都视情况被重新定义大小,或者被裁剪来适应大小。

  • setScaleType(ImageView.ScaleType)声明了图像应该被向着中心裁剪(如果必要)。

  • setPadding(int,int,int,int)定义了所有边的填充padding。注意到,如果图片有不同的横纵比例,那么在填充较少的情况下,如果图像没有到达给定的imageView的大小,就更有可能被裁减。

如果传递给getView的view不是null,那么本地的ImageView就使用循环回收的view进行初始化。

在getView方法的默认,position整型数被传递到这个这个方法被用来从mThumbIds数组来选择图像,他们是ImageView的的图像资源。

  • 运行这个应用
    尝试去使用不同的属性适配来试验GridView和IamgeView。例如,尝试用一下setAdjustViewBounds(Boolean)来取代setLayoutParams(ViewGroup.LayoutParams)。
Copyright© 2020-2022 li-xyz 冀ICP备2022001112号-1