上記のようにアルファベットなどでグルーピングされたリストに
グループタイトルをつける方法を考えてみた。
(PreferenceCategoryのタイトルのようなものです)
まず、ListViewの1行分のレイアウトを用意する。
その際、グループタイトル+通常要素(アルバム)となるようにする。
上記のようなアルバム一覧の場合、下記のようなレイアウトを用意する。
具体的なレイアウトのXMLは下記のようになる。
list_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="fill_parent"
- android:layout_height="fill_parent"
- >
- <!-- グループタイトル -->
- <TextView
- android:id="@+id/groupTitle"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:background="#280030"
- android:textColor="#c62b00"
- android:textStyle="bold"
- android:paddingLeft="5dp"
- />
- <!-- アルバム名 -->
- <TextView
- android:id="@+id/albumName"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:textColor="#FFFFFF"
- android:textSize="24sp"
- android:paddingLeft="5dp"
- />
- <!-- アーティスト名 -->
- <TextView
- android:id="@+id/artistName"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:paddingLeft="5dp"
- />
- </LinearLayout>
続いてArrayAdapterを継承したクラスを実装する。
MyAdapter.java
- package jp.u1aryz.products.grouptitle;
- import java.util.List;
- import android.content.Context;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.ArrayAdapter;
- import android.widget.TextView;
- class BindData {
- String groupTitle;
- String albumName;
- String artistName;
- public BindData(String groupTitle, String albumName, String artistName) {
- this.groupTitle = groupTitle;
- this.albumName = albumName;
- this.artistName = artistName;
- }
- }
- class ViewHolder {
- TextView groupTitle;
- TextView albumName;
- TextView artistName;
- }
- public class MyAdapter extends ArrayAdapter<BindData> {
- private LayoutInflater inflater;
- public MyAdapter(Context context, List<BindData> objects) {
- super(context, 0, objects);
- this.inflater = (LayoutInflater) context
- .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- }
- @Override
- public boolean isEnabled(int position) {
- // BindDataのgroupTitleが!nullの場合、選択不可にする
- return getItem(position).groupTitle == null;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder;
- if (convertView == null) {
- convertView = inflater.inflate(R.layout.list_item, parent, false);
- holder = new ViewHolder();
- holder.groupTitle = (TextView) convertView.findViewById(R.id.groupTitle);
- holder.albumName = (TextView) convertView.findViewById(R.id.albumName);
- holder.artistName = (TextView) convertView.findViewById(R.id.artistName);
- convertView.setTag(holder);
- } else {
- holder = (ViewHolder) convertView.getTag();
- }
- BindData data = getItem(position);
- // グループタイトル
- if (!isEnabled(position)) {
- holder.groupTitle.setVisibility(View.VISIBLE);
- holder.groupTitle.setText(data.groupTitle);
- holder.albumName.setVisibility(View.GONE);
- holder.artistName.setVisibility(View.GONE);
- // アルバム
- } else {
- holder.groupTitle.setVisibility(View.GONE);
- holder.albumName.setVisibility(View.VISIBLE);
- holder.albumName.setText(data.albumName);
- holder.artistName.setVisibility(View.VISIBLE);
- holder.artistName.setText(data.artistName);
- }
- return convertView;
- }
- }
ここでは選択不可の項目を設定する際、BindDataのgroupTileが!nullだった場合と
ルール決めをしている。
ポイントは63行目〜75行目になり、View#setVisibility(int visibility)を使用し、
各項目を表示、非表示と切り替える。
最後にActivityから以下のようにしてadapterを設定する。
- package jp.u1aryz.products.grouptitle;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.ListActivity;
- import android.os.Bundle;
- public class MyActivity extends ListActivity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- setTitle("アルバム一覧");
- List<BindData> list = new ArrayList<BindData>();
- // ここにlistに項目を追加する処理が入る
- MyAdapter adapter = new MyAdapter(this, list);
- setListAdapter(adapter);
- }
- }
正直もっといい方法がありそうなので、より良い方法が見つかったら更新するかも。。。