上記のようにアルファベットなどでグルーピングされたリストに
グループタイトルをつける方法を考えてみた。
(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); } }
正直もっといい方法がありそうなので、より良い方法が見つかったら更新するかも。。。