かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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です。