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


0 件のコメント:
コメントを投稿