かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

BaseAdapterを継承しよう

ListViewにデータを表示するためにAdapterを使いますが、こいつを実装してみたいとおもいます。

とりあえず、前提として以下のようなクラスを画面に表示するとします。

package com.example.kazuki.myapplication.data;

import android.provider.BaseColumns;

/**
 * Created by Kazuki on 2014/08/09.
 */
public class LogItem {
    private long id;
    private String timestamp;
    private String message;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

このクラスを表示するためのレイアウトファイルを準備します。ここではlayout_log_item.xmlという名前で作りました。

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Large Text"
        android:id="@+id/textView_message" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceSmall"
        android:text="Small Text"
        android:id="@+id/textView_timestamp" />
</LinearLayout>

Adapterクラスは、BaseAdapterクラスを継承して作ります。コンストラクタでLayoutInflater作るためのContextと、データのリストを受け取るようにしています。

package com.example.kazuki.myapplication;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.example.kazuki.myapplication.data.LogItem;

import java.util.List;

/**
 * Created by Kazuki on 2014/08/09.
 */
public class LogItemAdapter extends BaseAdapter {
    private LayoutInflater inflater;
    private List<LogItem> items;

    public LogItemAdapter(Context context, List<LogItem> objects) {
        this.inflater = LayoutInflater.from(context);
        this.items = objects;
    }

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

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

    @Override
    public long getItemId(int position) {
        return this.items.get(position).getId();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LogItem item = this.items.get(position);
        if (convertView == null) {
            convertView = this.inflater.inflate(R.layout.layout_log_item, null);
        }
        TextView message = (TextView) convertView.findViewById(R.id.textView_message);
        TextView time = (TextView) convertView.findViewById(R.id.textView_timestamp);
        message.setText(item.getMessage());
        time.setText(item.getTimestamp());
        return convertView;
    }
}

getCount, getItem, getItemIdは、抽象メソッドなのでさくっと実装しておきます。getViewでは、convertViewがnullのときは、inflaterを使ってViewを作ります。そして、データを必要な個所に設定していきます。めんどくさいですね。

使う時は、データとAdapterを用意して、ListViewとかにsetAdapterしてやればOKです。