xamarin android自定义可扩展列表视图

时间:2018-12-14 01:38:02

标签: c# android listview xamarin

我想知道如何创建一个可扩展列表视图,如下图所示,该视图将加载该指定日期中的所有日期和交易,并且可以扩展该交易以横向查看所有类别视图。

非常感谢

Custom List View Image

1 个答案:

答案 0 :(得分:0)

我根据您的屏幕截图编写了一个演示,您可以参考它。

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

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

Resources \ layout \ 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>

Resources \ layout \ 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>

Resources \ layout \ 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>

正在运行屏幕截图。

enter image description here

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