【问题标题】:xamarin android custom expandible list viewxamarin android自定义可扩展列表视图
【发布时间】:2018-12-14 01:38:02
【问题描述】:

我想知道如何创建一个可扩展的列表视图,如下图所示,它将加载该特定日期的所有日期和事务,并且可以扩展该事务以查看水平循环中的所有类别看法。

非常感谢

Custom List View Image

【问题讨论】:

    标签: c# android listview xamarin


    【解决方案1】:

    我根据你的截图写了一个demo,你可以参考一下。

    MainActivity.cs

        namespace ExpandListViewDemo1
    {
        [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)]
        public class MainActivity : AppCompatActivity
        {
            protected override void OnCreate(Bundle savedInstanceState)
            {
                base.OnCreate(savedInstanceState);
                // Set our view from the "main" layout resource
                SetContentView(Resource.Layout.activity_main);
                var listView = FindViewById<ExpandableListView>(Resource.Id.myExpandableListview);
                listView.SetAdapter(new ExpandableDataAdapter(this, Data.SampleData()));
            }
        }
    }
    

    ExpandableDataAdapter.cs

        namespace ExpandListViewDemo1
    {
    
    
    
         class ExpandableDataAdapter : BaseExpandableListAdapter
        {
    
            readonly Activity Context;
            public ExpandableDataAdapter(Activity newContext, List<Data> newList) : base()
            {
                Context = newContext;
                DataList = newList;
            }
    
            protected List<Data> DataList { get; set; }
    
            public override View GetGroupView(int groupPosition, bool isExpanded, View convertView, ViewGroup parent)
            {
                View header = convertView;
                if (header == null)
                {
                    header = Context.LayoutInflater.Inflate(Resource.Layout.ListGroup, null);
                }
                header.FindViewById<TextView>(Resource.Id.DataHeader).Text = ((char)(65 + groupPosition)).ToString();
    
                return header;
            }
    
            public override View GetChildView(int groupPosition, int childPosition, bool isLastChild, View convertView, ViewGroup parent)
            {
                View row = convertView;
                if (row == null)
                {
                    row = Context.LayoutInflater.Inflate(Resource.Layout.DataListItem, null);
                }
                string newId = "", newValue = "";
                GetChildViewHelper(groupPosition, childPosition, out newId, out newValue);
                row.FindViewById<TextView>(Resource.Id.DataId).Text = newId;
                row.FindViewById<TextView>(Resource.Id.DataValue).Text = newValue;
    
                return row;
                //throw new NotImplementedException ();
            }
    
            public override int GetChildrenCount(int groupPosition)
            {
                char letter = (char)(65 + groupPosition);
                List<Data> results = DataList.FindAll((Data obj) => obj.Id[0].Equals(letter));
                return results.Count;
            }
    
            public override int GroupCount
            {
                get
                {
                    return 26;
                }
            }
    
            private void GetChildViewHelper(int groupPosition, int childPosition, out string Id, out string Value)
            {
                char letter = (char)(65 + groupPosition);
                List<Data> results = DataList.FindAll((Data obj) => obj.Id[0].Equals(letter));
                Id = results[childPosition].Id;
                Value = results[childPosition].Value;
            }
    
            #region implemented abstract members of BaseExpandableListAdapter
    
            public override Java.Lang.Object GetChild(int groupPosition, int childPosition)
            {
                throw new NotImplementedException();
            }
    
            public override long GetChildId(int groupPosition, int childPosition)
            {
                return childPosition;
            }
    
            public override Java.Lang.Object GetGroup(int groupPosition)
            {
                throw new NotImplementedException();
            }
    
            public override long GetGroupId(int groupPosition)
            {
                return groupPosition;
            }
    
            public override bool IsChildSelectable(int groupPosition, int childPosition)
            {
            return true;
        }
    
            public override bool HasStableIds
            {
                get
                {
                    return true;
                }
            }
    
            #endregion
        }
    }
    

    DataAdapter.cs

     class DataAdapter : BaseAdapter<Data>
        {
            readonly Activity context;
    
            public DataAdapter(Activity newContext, List<Data> newData) : base()
            {
                context = newContext;
                DataList = newData;
            }
    
            public List<Data> DataList { get; set; }
    
            public override int Count
            {
                get
                {
                    return DataList.Count;
                }
            }
    
            public override View GetView(int position, View convertView, ViewGroup parent)
            {
                View newView = convertView; // re-use an existing view, if one is available
                if (newView == null) // otherwise create a new one
                    newView = context.LayoutInflater.Inflate(Resource.Layout.DataListItem, null);
                newView.FindViewById<TextView>(Resource.Id.DataId).Text = DataList[position].Id;
                newView.FindViewById<TextView>(Resource.Id.DataValue).Text = DataList[position].Value;
                return newView;
            }
    
            public override long GetItemId(int position)
            {
                return position;
            }
    
            public override Data this[int index]
            {
                get
                {
                    return DataList[index];
                }
            }
        }
    

    数据.cs

    class Data
    {
        public Data()
        {
        }
    
        public static List<Data> SampleData()
        {
            var newDataList = new List<Data>();
            newDataList.Add(new Data("Alabama", "Montegomery"));
            newDataList.Add(new Data("Alaska", "Juneau"));
            newDataList.Add(new Data("Arizona", "Pheonix"));
            newDataList.Add(new Data("Arkansas", "Little Rock"));
            newDataList.Add(new Data("California", "Sacramento"));
            newDataList.Add(new Data("Colorado", "Denver"));
            newDataList.Add(new Data("Connecticut", "Hartford"));
            newDataList.Add(new Data("Delaware", "Dover"));
            newDataList.Add(new Data("Florida", "Tallahassee"));
            newDataList.Add(new Data("Georgia", "Atlanta"));
            newDataList.Add(new Data("Hawaii", "Honolulu"));
            newDataList.Add(new Data("Idaho", "Boise"));
            newDataList.Add(new Data("Illinois", "Springfield"));
            newDataList.Add(new Data("Indiana", "Indianapolis"));
            newDataList.Add(new Data("Iowa", "Des Moines"));
            newDataList.Add(new Data("Kansas", "Topeka"));
    
            newDataList.Add(new Data("Kentucky", "Frankfort"));
            newDataList.Add(new Data("Louisiana", "Baton Rouge"));
            newDataList.Add(new Data("Maine", "Augusta"));
            newDataList.Add(new Data("Maryland", "Annapolis"));
            newDataList.Add(new Data("Massachusetts", "Boston"));
    
            newDataList.Add(new Data("Michigan", "Lansing"));
            newDataList.Add(new Data("Minnesota", "Saint Paul"));
            newDataList.Add(new Data("Mississippi", "Jackson"));
            newDataList.Add(new Data("Missouri", "Jefferson City"));
            newDataList.Add(new Data("Montana", "Helena"));
            newDataList.Add(new Data("Nebraska", "Lincoln"));
            newDataList.Add(new Data("Nevada", "Carson City"));
            newDataList.Add(new Data("New Hampshire", "Concord"));
            newDataList.Add(new Data("New Jersey", "Trenton"));
            newDataList.Add(new Data("New Mexico", "Santa Fe"));
            newDataList.Add(new Data("New York", "Albany"));
            newDataList.Add(new Data("North Calorina", "Raleigh"));
            newDataList.Add(new Data("North Dakota", "Bismarck"));
            newDataList.Add(new Data("Ohio", "Columbus"));
            newDataList.Add(new Data("Oklahoma", "Oklahoma City"));
            newDataList.Add(new Data("Oregon", "Salem"));
            newDataList.Add(new Data("Pennsylvania", "Harrisburg"));
            newDataList.Add(new Data("Rhode Island", "Providence"));
            newDataList.Add(new Data("South Carolina", "Columbia"));
            newDataList.Add(new Data("South Dakota", "Pierre"));
            newDataList.Add(new Data("Tennessee", "Nashville"));
            newDataList.Add(new Data("Texas", "Austin"));
            newDataList.Add(new Data("Utah", "Salt Lake City"));
            newDataList.Add(new Data("Vermont", "Montpelier"));
            newDataList.Add(new Data("Virginia", "Richmond"));
            newDataList.Add(new Data("Washington", "Olympia"));
            newDataList.Add(new Data("West Virginia", "Charleston"));
            newDataList.Add(new Data("Wisconsin", "Madison"));
            newDataList.Add(new Data("Wyoming", "Cheyenne"));
            return newDataList;
        }
    
        public Data(string newId = "Temporary Id", string newValue = "Temporary Data")
        {
            Id = newId;
            Value = newValue;
        }
    
        public string Id { get; set; }
        public string Value { get; set; }
    }
    

    资源\布局\activity_main.axml

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
         <ExpandableListView
            android:id="@+id/myExpandableListview"
            android:minWidth="25px"
            android:minHeight="25px"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    
    </RelativeLayout>
    

    资源\布局\DataListItem.axml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/DataRow"
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/DataId"
            android:text="Id"
            android:layout_margin="2dp"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:background="#ff5684e3"
            android:paddingStart="5dp"
            android:paddingLeft="5dp" />
        <TextView
            android:text="Value"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/DataValue"
            android:background="#ff366300"
    
            android:layout_marginLeft="2dp"
            android:layout_marginTop="2dp"
            android:layout_marginRight="2dp"
            android:layout_marginBottom="0dp"/>
    </LinearLayout>
    

    资源\布局\ListGroup.axml

    <?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/DataHeader"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:text="DataHeader"
            android:layout_margin="2dp"
            android:textStyle="bold"
            android:paddingStart="50dp"
            android:paddingLeft="50dp" />
    </LinearLayout>
    

    这是运行截图。

    如果您对此演示有任何疑问,可以在此处发布。

    【讨论】:

    • 太好了,我可以将交易及其下的类别列表添加为水平列表视图。但是交易日期呢?因为我认为我需要一个三层视图?例如,在 12 月 14 日,我可以有 2 笔交易,每笔交易下都有它的水平列表视图
    • @AliAlma,如果你需要三级视图,你可以参考这个链接。github.com/Billycool1020/Three-Level-ExpandableListView
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多