2013-01-11 42 views
3

我正在寻找使用可扩展列表视图实现片段。搜索后,我发现一个类实现可扩展列表视图片段https://gist.github.com/1316903。但我不知道如何使用它。请帮帮我。我试过列表片段,但我不知道如何使用带有可扩展列表视图的片段。Android可扩展列表视图片段

+1

我得到了一个片段内工作,但所有的代码是C#/ MonoDroid的,你要我将它张贴? – samosaris

回答

2

这是我在MonoDroid/C#中获得的。我不得不去掉一些代码(为了保密),但它应该基本完成。

此实现可以支持不同的子视图,其中每个组都包含一个特定的子类型,该子类型在整个组中都是相同的。但是,您可以在一个组中混合使用子类型,甚至可以使用不同的组类型(这实际上只改变了组标题;我对两个组使用相同的组类型,并使用该组的位置来确定子组 - 类型 - 所以group [0]包含ExpandableListChild1的子项和ExpandableListChild2的组[1] - 就像打算使用的那样)。

此处的子类型仅根据它们的背景颜色(为了简单起见)不同,但是这些视图可以是任何您需要的视图,包括自定义视图。只需为您需要的任何视图创建相应的ExpandListChild子类即可。此外,基类ExpandListChildAbs可以是任何您需要的来适合您的应用程序。如果您只有一个子类型,则不需要基类,但是如果有两个或更多基类,则需要某种基类,这两个子类型都可以继承以支持BaseExpandListListAdapter方法中的多态性getChild和相关方法。

[Activity(
    Label = "ExpandableListView in a Fragment", 
    Theme = "@android:style/Theme.NoTitleBar", 
    MainLauncher = false, 
    ConfigurationChanges = ConfigChanges.KeyboardHidden, 
    WindowSoftInputMode = SoftInput.AdjustPan | SoftInput.StateHidden)] 

public class Fragment1 : Fragment 
{ 
    private ViewGroup _thisView;  

    private Bundle _bundle; 
    private LayoutInflater _inflater; 
    private ViewGroup _container; 

    public override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle);   

     _bundle = bundle; 
     _model = Model; 
    } 

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle bundle) 
    { 
     base.OnCreateView(inflater, container, bundle); 

     _inflater = inflater; 
     _container = container; 
     _bundle = bundle; 

     Render(); 

     return _thisView; 
    }   

    public override void OnAttach(Activity activity) 
    { 
     base.OnAttach(activity); 

     _dialogListener = (IDialogWindow)activity; 
    }     

    //public Context LocalContext { get; set; } 

    public override void OnActivityCreated(Bundle savedInstanceState) 
    { 
     base.OnActivityCreated(savedInstanceState);    
    } 

    public override void OnViewCreated(View view, Bundle savedInstanceState) 
    { 
     base.OnViewCreated(view, savedInstanceState);    
    } 

    public override void Render() 
    { 
     _thisView = (ViewGroup)_inflater.Inflate(Resource.Layout.MainLayout, _container, false); 

     ExpandableListView elvParcelInfo = _thisView.FindViewById<ExpandableListView>(Resource.Id.elv_parcel_info); 
     List<ExpandListGroup> expandListItems = SetStandardGroups(); 
     ExpandListAdapter expandListAdapter = new ExpandListAdapter(Activity.ApplicationContext, expandListItems); 
     elvParcelInfo.SetAdapter(expandListAdapter); 
    } 

    public List<ExpandListGroup> SetStandardGroups() 
    { 
     List<ExpandListChild1> childern1 = new List<ExpandListChild1>(); 

     for (int i = 0; i < 20; i++) 
     { 
      ExpandListChild1 child1 = new ExpandListChild1(); 
      child1.Name = "child1 #" + i.ToString(); 
      child1.Tag = null; 

      childern1.Add(child1); 
     } 

     ExpandListGroup group1 = new ExpandListGroup(); 
     group1.Name = "Comedy"; 
     //group1.Items = childern1; 
     group1.Items = new List<ExpandListChildAbs>(); 
     foreach (ExpandListChild1 child1 in childern1) 
     { 
      group1.Items.Add(child1); 
     } 

     ///////////////////////////////////////////////////////////// 

     List<ExpandListChild2> childern2 = new List<ExpandListChild2>(); 

     for (int i = 0; i < 20; i++) 
     { 
      ExpandListChild2 child2 = new ExpandListChild2(); 
      child2.Name = "child2 #" + i.ToString(); 
      child2.Tag = null; 

      childern2.Add(child2); 
     } 

     ExpandListGroup group2 = new ExpandListGroup(); 
     group2.Name = "Action"; 
     //group2.Items = childern2; 
     group2.Items = new List<ExpandListChildAbs>(); 
     foreach (ExpandListChild2 child2 in childern2) 
     { 
      group2.Items.Add(child2); 
     } 

     ///////////////////////////////////////////////////////////// 

     List<ExpandListGroup> groups = new List<ExpandListGroup>(); 
     groups.Add(group1); 
     groups.Add(group2); 

     return groups; 
    } 

    public abstract class ExpandListChildAbs : Java.Lang.Object 
    { 
     public abstract String Name { get; set; } 
     public abstract String Tag { get; set; } 
    } 

    public class ExpandListChild1 : ExpandListChildAbs 
    { 
     public override String Name { get; set; } 
     public override String Tag { get; set; } 
    } 

    public class ExpandListChild2 : ExpandListChildAbs 
    { 
     public override String Name { get; set; } 
     public override String Tag { get; set; } 
    } 

    public class ExpandListGroup : Java.Lang.Object 
    { 
     public String Name { get; set; } 
     public List<ExpandListChildAbs> Items { get; set; } 
    } 

    public class ExpandListAdapter : BaseExpandableListAdapter 
    { 
     private enum ChildTypes { ChildType1, ChildType2 } 
     private Context context; 
     private List<ExpandListGroup> groups; 

     public ExpandListAdapter(Context context, List<ExpandListGroup> groups) 
     { 
      this.context = context; 
      this.groups = groups; 
     } 

     public void AddItem(ExpandListChildAbs item, ExpandListGroup group) 
     {        
      if (!groups.Contains(group)) 
      { 
       groups.Add(group); 
      } 

      int index = groups.IndexOf(group); 

      List<ExpandListChildAbs> ch = groups[index].Items; 

      ch.Add(item); 
      groups[index].Items = ch; 
     } 

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

     public override bool IsChildSelectable(int arg0, int arg1) 
     { 
      return true; 
     } 

     //______________________________________________________________________________________________________ 
     // Get Child Methods 
     //______________________________________________________________________________________________________ 

     public override long GetChildId(int groupPosition, int childPosition) 
     { 
      return childPosition;     
     } 

     public override int GetChildrenCount(int groupPosition) 
     { 
      List<ExpandListChildAbs> chList = groups[groupPosition].Items;    

      return chList.Count; 
     } 

     public override int ChildTypeCount 
     { 
      get { return Enum.GetNames(typeof(ChildTypes)).Length; } 
     } 

     public override int GetChildType(int groupPosition, int childPosition) 
     { 
      //return base.GetChildType(groupPosition, childPosition); 

      if (groupPosition == 0) 
      { 
       return (int)ChildTypes.ChildType1; 
      } 

      if (groupPosition == 1) 
      { 
       return (int)ChildTypes.ChildType2; 
      } 

      return 0; 
     } 

     public override Java.Lang.Object GetChild(int groupPosition, int childPosition) 
     { 
      List<ExpandListChildAbs> chList = groups[groupPosition].Items; 

      return chList[childPosition]; 
     } 

     public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View view, ViewGroup parent) 
     { 
      int ChildType = GetChildType(groupPosition, childPosition); 

      if (ChildType == (int)ChildTypes.ChildType1) 
      { 
       return GetChildView_ChildType1(groupPosition, childPosition, isLastChild, view, parent); 
      } 

      if (ChildType == (int)ChildTypes.ChildType2) 
      { 
       return GetChildView_ChildType2(groupPosition, childPosition, isLastChild, view, parent); 
      } 

      return null; 
     } 

     private View GetChildView_ChildType1(int groupPosition, int childPosition, bool isLastChild, View view, ViewGroup parent) 
     { 
      ExpandListChild1 child1 = (ExpandListChild1)GetChild(groupPosition, childPosition); 

      if (view == null) 
      { 
       LayoutInflater infalInflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService); 

       view = infalInflater.Inflate(Resource.Layout.ExpandList_ChildItem1, null); 
      } 

      TextView tv = view.FindViewById<TextView>(Resource.Id.tvChild1); 

      tv.Text = child1.Name; 
      tv.Tag = child1.Tag; 

      return view; 
     } 

     private View GetChildView_ChildType2(int groupPosition, int childPosition, bool isLastChild, View view, ViewGroup parent) 
     { 
      ExpandListChild2 child2 = (ExpandListChild2)GetChild(groupPosition, childPosition); 

      if (view == null) 
      { 
       LayoutInflater infalInflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService); 

       view = infalInflater.Inflate(Resource.Layout.ExpandList_ChildItem2, null); 
      } 

      TextView tv = view.FindViewById<TextView>(Resource.Id.tvChild2); 

      tv.Text = child2.Name; 
      tv.Tag = child2.Tag; 

      return view; 
     } 

     //________________________________________________________________________________________________________ 


     //______________________________________________________________________________________________________ 
     // Get Group Methods 
     //______________________________________________________________________________________________________ 

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

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

     public override int GroupTypeCount 
     { 
      get { return base.GroupTypeCount; } 
     } 

     public override int GetGroupType(int groupPosition) 
     { 
      return base.GetGroupType(groupPosition); 
     } 

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

     public override View GetGroupView(int groupPosition, bool isLastChild, View view, ViewGroup parent) 
     { 
      ExpandListGroup group = (ExpandListGroup) GetGroup(groupPosition); 

      if (view == null) 
      { 
       LayoutInflater inf = (LayoutInflater) context.GetSystemService(Context.LayoutInflaterService); 

       view = inf.Inflate(Resource.Layout.ExpandList_GroupItem, null); 
      } 

      TextView tv = view.FindViewById<TextView>(Resource.Id.tvGroup); 

      tv.Text = group.Name; 

      return view; 
     } 

     //________________________________________________________________________________________________________ 
    }  
} 

MainLayout

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/ll_left_parcel" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="#FF8F8D8F">  

    <ExpandableListView 
    android:id="@+id/elv_parcel_info" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="#FFCFCDCF" 
    android:groupIndicator="@null"/> 

</LinearLayout> 

ExpandList_GroupItem

<?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="55dip" 
    android:background="#FF00AA55" 
    android:orientation="vertical" > 


    <TextView 
     android:id="@+id/tvGroup" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginRight="15dp" 
     android:textColor="#FF000000" 
     android:textSize="17dip" /> 

</LinearLayout> 

ExpandList_ChildItem1

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="55dip" 
    android:background="#FF8800CC" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/tvChild1" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textColor="#FF000000" 
     android:textSize="17dip" /> 

</LinearLayout> 

ExpandList_ChildItem2

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="55dip" 
    android:background="#FFAA00FF" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/tvChild2" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textColor="#FF000000" 
     android:textSize="17dip" /> 

</LinearLayout> 
2

Android在ApiDemos项目中有很多工作代码示例。你可以在eclipse中以New - >“Android Sample Project”的形式获取它。 ApiDemos有一个可扩展列表的好例子。在使用更复杂和先进的示例之前,这是一个非常好的起点。

+0

你好我试过简单的可扩展列表视图..但我必须与碎片整合..这是我的要求..请帮助我.. – Sunny