また、展開可能なリストで子をカスタマイズすることは可能ですか?
SimpleExpandableListAdapter
の操作は簡単ではありません。 ExpandableListActivity
を使用していると仮定して、開始する必要があるいくつかのコードを次に示します。
この例では、グループヘッダービューに標準のAndroid.R.layout.simple_expandable_list_item_1
を使用していますが、子には独自のカスタムレイアウトを使用しています。
// Construct Expandable List
final String NAME = "name";
final String IMAGE = "image";
final LayoutInflater layoutInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final ArrayList<HashMap<String, String>> headerData = new ArrayList<HashMap<String, String>>();
final HashMap<String, String> group1 = new HashMap<String, String>();
group1.put(NAME, "Group 1");
headerData.add( group1 );
final HashMap<String, String> group2 = new HashMap<String, String>();
group2.put(NAME, "Group 2");
headerData.add( group2);
final ArrayList<ArrayList<HashMap<String, Object>>> childData = new ArrayList<ArrayList<HashMap<String, Object>>>();
final ArrayList<HashMap<String, Object>> group1data = new ArrayList<HashMap<String, Object>>();
childData.add(group1data);
final ArrayList<HashMap<String, Object>> group2data = new ArrayList<HashMap<String, Object>>();
childData.add(group2data);
// Set up some sample data in both groups
for( int i=0; i<10; ++i) {
final HashMap<String, Object> map = new HashMap<String,Object>();
map.put(NAME, "Child " + i );
map.put(IMAGE, getResources().getDrawable(R.drawable.icon));
( i%2==0 ? group1data : group2data ).add(map);
}
setListAdapter( new SimpleExpandableListAdapter(
this,
headerData,
Android.R.layout.simple_expandable_list_item_1,
new String[] { NAME }, // the name of the field data
new int[] { Android.R.id.text1 }, // the text field to populate with the field data
childData,
0,
null,
new int[] {}
) {
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
final View v = super.getChildView(groupPosition, childPosition, isLastChild, convertView, parent);
// Populate your custom view here
((TextView)v.findViewById(R.id.name)).setText( (String) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(NAME) );
((ImageView)v.findViewById(R.id.image)).setImageDrawable( (Drawable) ((Map<String,Object>)getChild(groupPosition, childPosition)).get(IMAGE) );
return v;
}
@Override
public View newChildView(boolean isLastChild, ViewGroup parent) {
return layoutInflater.inflate(R.layout.expandable_list_item_with_image, null, false);
}
}
);
expandable_list_item_with_image.xml
という名前のカスタムの子レイアウト内:
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content">
<ImageView
Android:id="@+id/image"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
<TextView
Android:id="@+id/name"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="right" />
</RelativeLayout>
documentation で説明されているように、BaseExpandableListAdapterを拡張する独自のリストアダプターを作成してみることができます。
次に、getGroupView(..)
(親アイテムの場合は、または子アイテムの場合はgetChildView)関数をオーバーライドします。この関数で、独自のレイアウトxmlを拡張できます。
このようなもの:
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent)
{
View v = convertView;
if (v == null) {
//sender is activity from where you call this adapter. Set it with construktor.
LayoutInflater vi = (LayoutInflater)sender.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
//children = arraylists of Child
Child c = children.get(childPosition);
if (c != null) {
TextView tt = (TextView) v.findViewById(R.id.toptext);
TextView bt = (TextView) v.findViewById(R.id.bottomtext);
ImageView icon = (ImageView) v.findViewById(R.id.rowicon);
if (tt != null) {
tt.setText(c.text1); }
if(bt != null){
bt.setText(c.text2);
}
if (icon != null)
{
icon.setImageResource(R.drawable.rowicon);
}
}
return v;
}
レイアウト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="6dip">
<ImageView
Android:id="@+id/rowicon"
Android:layout_width="wrap_content"
Android:layout_height="fill_parent"
Android:layout_marginRight="6dip" />
<LinearLayout
Android:orientation="vertical"
Android:layout_width="0dip"
Android:layout_weight="1"
Android:layout_height="fill_parent">
<TextView
Android:id="@+id/toptext"
Android:layout_width="fill_parent"
Android:layout_height="0dip"
Android:layout_weight="1"
Android:gravity="center_vertical"
/>
<TextView
Android:layout_width="fill_parent"
Android:layout_height="0dip"
Android:layout_weight="1"
Android:id="@+id/bottomtext"
Android:singleLine="true"
Android:ellipsize="Marquee"
/>
</LinearLayout>
</LinearLayout>
GetGroupViewをオーバーライドした後、setCompoundDrawablesWithIntrinsicBounds
関数を使用して画像を追加できます。
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
{
View v = super.getGroupView(groupPosition, isExpanded, convertView, parent);
TextView tv = (TextView) v.findViewById(R.id.textViewId);
tv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.imageToAdd, 0, 0, 0);
return v;
}
私はより良い方法を見つけました、あなたは単に追加することができます
Android:drawableRight="@drawable/icon"
リストグループのレイアウトxmlファイルへの行。
これを試してください>>> チュートリアル
子xmlファイルにテキストではなく画像を追加するために更新できます