3

Android用MonoでBaseExpandableListAdapterを使用する例はありますか?私は自分の見解の1つにこれを実装しようとしていますが、徹底的なものを見つけるのに問題があります。誰かがこれをMonoforAndroidでどのように機能させたかについての例を提供できますか?

4

1 に答える 1

2

これは、明らかに大雑把に見えますが、カスタムの拡張可能なリストアダプタを使用した機能的な例です。各アイテムが展開されてその下にアイテムのリストが表示されるため、データソースはリストのリストと考えることができます。これを表すために、次の単純なモデルを使用します。

public class Group : Java.Lang.Object
{
    public string Name { get; set; }
    public IList<string> Items { get; set; }
}

そのモデルを使用して、BaseExpandableListAdapterから継承し、必要なすべてのメソッド/プロパティを実装するクラスを作成できます。

public class MyAdapter : BaseExpandableListAdapter
{
    private readonly Context _context;
    private readonly IList<Group> _groups;

    public MyAdapter(Context context, IList<Group> groups)
    {
        _context = context;
        _groups = groups;
    }

    public override Java.Lang.Object GetChild(int groupPosition, int childPosition)
    {
        return _groups[groupPosition].Items[childPosition];
    }

    public override long GetChildId(int groupPosition, int childPosition)
    {
        return (groupPosition * _groups.Count) + childPosition;
    }

    public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
    {
        var view = (TextView)(convertView ?? new TextView(_context));

        view.Text = _groups[groupPosition].Items[childPosition];

        return view;
    }

    public override int GetChildrenCount(int groupPosition)
    {
        return _groups[groupPosition].Items.Count;
    }

    public override Java.Lang.Object GetGroup(int groupPosition)
    {
        return _groups[groupPosition];
    }

    public override long GetGroupId(int groupPosition)
    {
        return groupPosition;
    }

    public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent)
    {
        var view = (TextView)(convertView ?? new TextView(_context));

        view.Text = _groups[groupPosition].Name;

        return view;
    }

    public override bool IsChildSelectable(int groupPosition, int childPosition)
    {
        return true;
    }

    public override int GroupCount
    {
        get { return _groups.Count; }
    }

    public override bool HasStableIds
    {
        get { return true; }
    }
}

アダプターのコンストラクターはグループのリストを受け取り、それを使用してグループやアイテムなどを要求するメソッドを実装します。簡単にするために、ビューごとに1つのTextViewをレンダリングするだけですが、次のように作成できます。アイテムに必要なビューを膨らませます。

これを実際に示すために、いくつかのデータを含む拡張可能なリストをロードするサンプルアクティビティを次に示します。

[Activity(Label = "ExpandableListDemo", MainLauncher = true, Icon = "@drawable/icon")]
public class MyExpandableListActivity : ExpandableListActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        var groups = new List<Group>
                         {
                             new Group
                                 {
                                     Name = "Group 1",
                                     Items = new List<string> { "Item 1.1", "Item 1.2", "Item 1.3" }
                                 },
                            new Group
                                 {
                                     Name = "Group 2",
                                     Items = new List<string> { "Item 2.1", "Item 2.2", "Item 2.3" }
                                 }
                         };

        var adapter = new MyAdapter(this, groups);

        SetListAdapter(adapter);
    }
}
于 2012-05-08T19:36:20.150 に答える