2012-05-08 40 views

回答

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; } 
    } 
} 

构造为适配器接受一个组的列表,并使用它来实现要求一个组,项目等的方法。为了简单起见,对于每个视图,我只是渲染一个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); 
    } 
} 
+0

这看起来像正是我需要的。我接近了我对适配器的看法,但是你的方法比我试图通过的复杂步骤要干净,而且我试图通过标准活动来完成所有这些。感谢您的帮助,Greg! –