Android. Пользовательские элементы GridView

февраля
28
2012
Метки: android gridview

В этой статье рассматривается возможность создания пользовательских элементов для компонента GridView. Эта проблема порождена тем, что адаптер для GridView воспринимает как элементы только объекты класса View. В качестве примера будет использоваться элемент, состоящий из изображения и текста.

Приступим к примеру. Для начала нам понадобится объявить блок GridView в разметке. Например:


<?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" >

    <GridView
        android:id="@+id/custom_grid"
        android:columnWidth="100dp"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:numColumns="auto_fit" >
    </GridView>

</LinearLayout>

Проинициализируем GridView, добавив адаптер в методе onCreate() класса Activity:


package com.seostella.customgridview;

import android.app.Activity;
import android.os.Bundle;
import android.widget.GridView;

public class CustomGridViewActivity extends Activity {
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		GridView customGrid = (GridView) findViewById(R.id.custom_grid);
		customGrid.setAdapter(new CustomGridAdapter(this));
	}
}

Создадим адаптер для GridView:


package com.seostella.customgridview;

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 CustomGridAdapter extends BaseAdapter{
	private Context context;

	public CustomGridAdapter(Context context) {
		this.context = context;
	}

	@Override
	public int getCount() {
		return 12;
	}

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

		if (convertView == null) {
			LayoutInflater li = LayoutInflater.from(context);
			customView = li.inflate(R.layout.item, null);

			TextView tv = (TextView) customView
					.findViewById(R.id.item_text_view);
			tv.setText("Item " + position);

			ImageView iv = (ImageView) customView
					.findViewById(R.id.item_image_view);
			iv.setImageResource( R.drawable.ic_launcher );
		}

		return customView;
	}

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

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


Рассмотрим ключевые особенности этого класса.


public int getCount() {
	return 12;
}

- означает, что в GridView будет 12 элементов.

В методе getView() происходит создание пользовательского элемента GridView. Ниже приведен этот метод.


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

	if (convertView == null) {
		LayoutInflater li = LayoutInflater.from(context);
		customView = li.inflate(R.layout.item, null);

		TextView tv = (TextView) customView
				.findViewById(R.id.item_text_view);
		tv.setText("Item " + position);

		ImageView iv = (ImageView) customView
				.findViewById(R.id.item_image_view);
		iv.setImageResource( R.drawable.ic_launcher );
	}

	return customView;
}

Для создания пользовательского элемента, достаточно получить его разметку с помощью следующих двух строчек кода:


// ...
LayoutInflater li = LayoutInflater.from(context);
customView = li.inflate(R.layout.item, null);
// ...

Дальше с элементом можно производить те же операции, что и с обычным элементом разметки. В данном случае каждому элементу присваевается текст "Item 0", "Item 1", "Item 2" и т.д. А для всех изображений будет использована стандартная иконка R.drawable.ic_launcher.

Разметка элемента, которая использовалась в примере (файл item.xml):


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/item" 
	android:layout_width="wrap_content"
	android:layout_height="wrap_content" 
	android:orientation="vertical" >

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

	<TextView 
		android:id="@+id/item_text_view"
		android:layout_width="wrap_content" 
		android:layout_height="wrap_content" >
	</TextView>

</LinearLayout>

В итоге Вы увидите на экране эмулятора (мобильного телефона) следующее окно:

Android. Пользовательские элементы GridView

Напишите первое сообщение!

Вы должны войти под своим аккаунтом чтобы оставлять комментарии