リストビューのカスタマイズ

Android Tips

リストビューのカスタマイズには、ArrayAdapterクラスを使用します。

まずはリスト要素のデータクラスを作成します。
下記の例では、アイコンとタイトルが表示されることを想定してます。

リスト要素のクラス

package org.mypkg;

public class MyListBean{
  private int iconId_;
  private String title_;

  public int getIcon(){
    return iconId_;
  }

  public void setIcon(int iconId){
    iconId_ = iconId;
  }

  public String getTitle(){
    return title_;
  }

  public void setTitle(String title){
    title_ = title;
  }
}

次にアダプタークラスを作成します。
コンストラクタでsuperを呼び、getViewメソッドをオーバーライドします。
下記の例では、リスト要素のレイアウトをxmlで定義し、inflaterで取得してます。

アダプタークラス

package org.mypkg;

import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MyAdapter extends ArrayAdapter{
  private LayoutInflter inflater_;
  private ArrayList items_;

  public MyAdapter(Context context,LayoutInflater inflater,int textViewResourceId,ArrayList items){
    super(context,textViewResourceId,items);
    inflater_ = inflater;
    items_ = items;
  }

  @Override
  public View getView(int position,View convertView,ViewGroup parent){
    if(onvertView == null){
      convertView = inflater_.inflate(org.mypkg.R.layout.myitem,null);
      // convertView.setBackgroundResource(org.mypkg.R.drawable.mydrawable);
    }

    MyListBean item = (MyListBean)items_.get(position);
    if(item != null){
      ImageView icon = (ImageView)convertView.findViewById(org.mypkg.R.id.myitem_icon);
      icon.setImageResource(item.getIcon());
      TextView title = (TextView)convertView.findViewById(org.mypkg.R.id.myitem_title);
      title.setTitle(item.getTitle());
    }
    return convertView;
  }
}

リスト要素のレイアウト
res/layout/myitem.xml

<?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="?android:attr/listPreferredItemHeight"
  android:padding="5dp"
>
<ImageView android:id="@+id/myitem_icon"
  android:layout_width="wrap_content"
  android:layout_height="fill_parent"
  android:scaleType="center"
/>
<TextView android:id="@+id/myitem_title"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:textSize="20sp"
  android:textColor="#00000000"
/>
</LinearLayout>

最後にリストの構築です。
要素を作成し、アダプタにセットし、リストビューにセットするという流れです。

package org.mypkg;

import java.util.ArrayList;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

public class MyClass extends Activity implements OnItemClickListener{

  public void myMethod(){
    // リストの要素を作成
    MyListBean item1 = new MyListBean();
    item1.setIcon(R.drawable.ic_myicon1);
    item1.setTitle("Title1");
    MyListBean item2 = new MyListBean();
    item2.setIcon(R.drawable.ic_myicon2);
    item2.setTitle("Title2");

    // 要素をArrayListにまとめる
    ArrayList list = new ArrayList();
    list.add(item1);
    list.add(item2);

    // アダプタにセットする
    LayoutInflater inflater = this.getLayoutInflater();
    MyAdapter adapter = new MyAdapter(this,inflater,android.R.layout.simple_list_item_1,list);

    // リストビューにアダプタをセットする
    ListView view = (ListView)this.findViewById(R.id.mylist);
    view.setAdapter(adapter);

    view.setOnItemClickListener(this);
  }

  // アイテムがクリックされた
  public void onItemClick(AdapterView parent,View view,int position,long id){
  }
}

注意点としては、ScrollViewでくくらないとリストが増えてもスクロールしてくれないところ。

res/layout/main.xml

<?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"
>
<ScrollView
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:fadingEdge="none"
  android:fillViewport="true"
  android:scrollbars="none"
>
<ListView android:id="@+id/mylist">
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
/>
</ScrollView>
</LinearLayout>

コメント