GridView кастомный адаптер

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

 

Шаг 1. Создание проекта

Для этого примера я созал новый Android Gradle проект и добавил в него проектой MainActivity:

package com.devcolibri.gridviewcustomadapter.app.activity;

import android.app.Activity;
import android.os.Bundle;
import com.devcolibri.gridviewcustomadapter.app.R;

public class MainActivity extends Activity {

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

}

Теперь создадим новый layout activity_main.xml как показанно в 12-й строке он нужн для нашего MainActivity:

<?xml version="1.0" encoding="utf-8"?>

<GridView xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:numColumns="auto_fit"
              android:id="@+id/gridView">

</GridView>

Также не забудьте добавить activity в AndroidManifest.xml:

<activity android:name=".activity.MainActivity" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Обратите внимание что я использую не LinerLayout и не другие типы Layout-ов а GridView, но это не критично и вам не обязательно делать также. В этом примере мне не нужны другие layout поэтом я решил не использовать их.

GridView – компонент, который представляет данные в виде сетки. Инициализируется с помощью Адаптеров.

Также стоит обратить внимание на некоторые свойства компонента GridView:

android:numColumns="auto_fit" — тут мы указываем количество колонок, так как установленно свойство auto_fit, то это количество будет определятся устройством.
android:id="@+id/gridView" — мы указали ID чтобы иметь доступ к этому компоненту и добавлять элементы.

 

Шаг 2. Объект — элемент GridView

Теперь перед нами стоит задача заполнить наш GridView кнопками с именем продукта.

Для начало создадим наш продукт:

package com.devcolibri.gridviewcustomadapter.app.dto;

public class Product {

    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Этим объектом мы будем заполнять наш GridView.

 

Шаг 3. Создаём адаптер

Для того чтобы мы могли заполнить наш GridView созданым объектом во втором шаге нам нужно создать адаптер.

Создаем класс ProductAdapter и наслеуем его от BaseAdapter:

package com.devcolibri.gridviewcustomadapter.app.adapter;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import com.devcolibri.gridviewcustomadapter.app.dto.Product;

import java.util.List;

public class ProductAdapter extends BaseAdapter {

    private Context context;
    private List<Product> products;

    public ProductAdapter(Context context, List<Product> products) {
        this.context = context;
        this.products = products;
    }

    @Override
    public int getCount() {
        return products.size();
    }

    @Override
    public Object getItem(int position) {
        return products.get(position);
    }

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

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

        if (convertView == null) {
            button = new Button(context);
            button.setText(products.get(position).getName());
        } else {
            button = (Button) convertView;
        }
        button.setId(position);

        return button;
    }
}

Как видите унаследовав BaseAdapter нам нужно было реализовать несколько методов, давайте их разберем.

Для начало нам нужно объявить наш список обектов (смотреть строку 15). Далее нужно создать переменую для контекста, он нам потребуется для заполнения обектов GridView.

int getCount() — должен возвращать количество элементов GridView, это наш список в строке 15;

Object getItem(int position) — возвращает эелемент с нашего GridView, где position — это индекс элемента в нашем списке;

long getItemId(int position) — возвращает id нашего элемента, в нашем случае он соответствует позиции.

View getView(int position, View convertView, ViewGroup parent) — должен возвращать элемент, который будет добавлен в GridView. Обычно тут создают и конфигурируют элемент для GridView.

 

Шаг 4. Применяем наш адаптер

Осталось применить наш адаптер для нашего GridView. Вернемся в MainActivity и в метод onCreate добавим создание списка наших продуктов:

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

    List<Product> products = new ArrayList<Product>();
    products.add(new Product("Product #1", 22));
    products.add(new Product("Product #2", 66));
    products.add(new Product("Product #3", 89));
    products.add(new Product("Product #4", 77));

    gridView = (GridView) findViewById(R.id.gridView);
    gridView.setAdapter(new ProductAdapter(this, products));
}

После того как подготовили список продуктов, нужно применить наш адаптер к нашему GridView. Получаем GridView используя метод findViewById и после в строке 13 мы устанавливаем наш адаптер и в качестве параметра передаём контекст и список продуктов.

После запуска мы увидим слудеющее:

И общая структура проекта:

 

Урок создан: 01 августа 2014 | Просмотров: 15297 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 08 августа 2014 в 14:40

    Mix

    Что то мало стало добавляться уроков

    • 09 августа 2014 в 16:23

      Александр Барчук

      Очень активно работаем над новым ядром проекта, скоро все вернется на свои места)

      • 28 апреля 2015 в 09:19

        Евгений

        Можно поинтересоваться, что за «новое ядро проекта». На вашем сайте всего пол часа, андроид изучаю месяца 2. Очень благодарен за Вашу работу. Продолжайте в том же духе преподносить информацию. Просто легко и понятно — непринужденно в общем, естественно :)

  • 27 декабря 2015 в 11:54

    Виктор

    Ребят запилите пожалуйста видео о создании горизонтального кастомного listview’a