diff --git a/sample/HotUI.Android.Sample/MainActivity.cs b/sample/HotUI.Android.Sample/MainActivity.cs index 9afe4d6d37ba..2bd2f639321f 100644 --- a/sample/HotUI.Android.Sample/MainActivity.cs +++ b/sample/HotUI.Android.Sample/MainActivity.cs @@ -10,7 +10,7 @@ namespace HotUI.Android.Sample { - [Activity(Label = "@string/app_name", Theme = "@style/AppTheme.NoActionBar", MainLauncher = true)] + [Activity(Label = "@string/app_name", MainLauncher = true)] public class MainActivity : HotUIActivity { diff --git a/sample/HotUI.Samples/MainPage.cs b/sample/HotUI.Samples/MainPage.cs index 643a0eb21276..91b89edf9cfe 100644 --- a/sample/HotUI.Samples/MainPage.cs +++ b/sample/HotUI.Samples/MainPage.cs @@ -61,6 +61,8 @@ public MainPage (List additionalPage = null) if (additionalPage != null) pages.AddRange(additionalPage); + this.Title("UI Samples"); + Body = () => new NavigationView { new ListView (pages) diff --git a/src/HotUI.Android/Controls/HotUIFragment.cs b/src/HotUI.Android/Controls/HotUIFragment.cs index 339f05e32b62..37de4abab39a 100644 --- a/src/HotUI.Android/Controls/HotUIFragment.cs +++ b/src/HotUI.Android/Controls/HotUIFragment.cs @@ -9,10 +9,12 @@ namespace HotUI.Android.Controls public class HotUIFragment : Fragment { private readonly View view; + public string Title { get; } + public HotUIFragment(View view) { this.view = view; - + this.Title = view?.GetEnvironment(EnvironmentKeys.View.Title) ?? ""; } AView currentBuiltView; public override AView OnCreateView(LayoutInflater inflater, @@ -20,7 +22,7 @@ public override AView OnCreateView(LayoutInflater inflater, Bundle savedInstanceState) => currentBuiltView = view.ToView(false); public override void OnDestroy() { - if(view != null) + if (view != null) { view.ViewHandler = null; } diff --git a/src/HotUI.Android/Handlers/ListViewHandler.cs b/src/HotUI.Android/Handlers/ListViewHandler.cs index b9b9746da862..37a212f2308f 100644 --- a/src/HotUI.Android/Handlers/ListViewHandler.cs +++ b/src/HotUI.Android/Handlers/ListViewHandler.cs @@ -1,35 +1,25 @@ using System; using Android.Views; using Android.Widget; +using Android.Support.V7.Widget; using AView = Android.Views.View; -using AListView = Android.Widget.ListView; using HotUI.Android.Controls; namespace HotUI.Android.Handlers { - public class ListViewHandler : AListView, AndroidViewHandler + public class ListViewHandler : RecyclerView, AndroidViewHandler { public event EventHandler NativeViewChanged; public ListViewHandler() : base(AndroidContext.CurrentContext) { - this.Adapter = new ListViewAdapter(); - this.ItemSelected += ListViewHandler_ItemSelected; - this.ItemClick += ListViewHandler_ItemClick; - } + var layoutManager = new LinearLayoutManager(this.Context); - private void ListViewHandler_ItemClick(object sender, ItemClickEventArgs e) - { - //TODO: Account for Section - ((ListViewAdapter) this.Adapter).ListView?.OnSelected(0,e.Position); + SetLayoutManager(layoutManager); + this.SetAdapter(new RecyclerViewAdapter()); + this.AddItemDecoration(new DividerItemDecoration(Context, layoutManager.Orientation)); } - private void ListViewHandler_ItemSelected(object sender, ItemSelectedEventArgs e) - { - //TODO: Account for Section - ((ListViewAdapter) this.Adapter).ListView?.OnSelected(0,e.Position); - } - public AView View => this; public object NativeView => View; public bool HasContainer { get; set; } = false; @@ -53,65 +43,90 @@ public void Remove(View view) public void SetView(View view) { - ((ListViewAdapter) this.Adapter).ListView = view as ListView; + ((RecyclerViewAdapter)this.GetAdapter()).ListView = view as ListView; ViewHandler.AddGestures(this, view); } public void UpdateValue(string property, object value) { - if(nameof(ListView.ReloadData) == property) + switch (property) { - (this.Adapter as ListViewAdapter)?.NotifyDataSetChanged(); - } - else if (property == Gesture.AddGestureProperty) - { - ViewHandler.AddGesture(this, (Gesture)value); - } - else if (property == Gesture.RemoveGestureProperty) - { - ViewHandler.RemoveGesture(this, (Gesture)value); + case nameof(ListView.ReloadData): + ((RecyclerViewAdapter)this.GetAdapter()).NotifyDataSetChanged(); + break; + case Gesture.AddGestureProperty: + ViewHandler.AddGesture(this, (Gesture)value); + break; + case Gesture.RemoveGestureProperty: + ViewHandler.RemoveGesture(this, (Gesture)value); + break; } } - class ListViewAdapter : BaseAdapter + class RecyclerViewAdapter : Adapter { public IListView ListView { get; set; } - //TODO: Account for Section - public override object this[int position] => ListView?.ViewFor(0,position); //TODO: Account for Section - public override int Count => ListView?.Rows(0) ?? 0; - - public override long GetItemId(int position) => position; + public override int ItemCount => ListView?.Rows(0) ?? 0; - public override AView GetView(int position, AView convertView, ViewGroup parent) + public override void OnBindViewHolder(ViewHolder holder, int position) { + var rvh = holder as RecyclerViewHolder; + //TODO: Account for Section - var view = ListView?.ViewFor(0,position); + var view = ListView?.ViewFor(0, position); var cell = view?.ToView(); - var displayMetrics = parent.Context.Resources.DisplayMetrics; - var density = displayMetrics.Density; - - var scaledSize = new SizeF(parent.Width / density, parent.Height / density); - var measuredSize = view.Measure(scaledSize); - view.MeasuredSize = measuredSize; - view.MeasurementValid = true; + if (rvh != null && cell != null) + { + var parent = rvh.Parent; - cell.LayoutParameters = new ViewGroup.LayoutParams(parent.Width, (int)(measuredSize.Height* density)); - cell.SetMinimumHeight((int)(measuredSize.Height * density)); + var displayMetrics = parent.Context.Resources.DisplayMetrics; + var density = displayMetrics.Density; - return cell; + var scaledSize = new SizeF(parent.Width / density, parent.Height / density); + var measuredSize = view.Measure(scaledSize); + view.MeasuredSize = measuredSize; + view.MeasurementValid = true; + + cell.LayoutParameters = new ViewGroup.LayoutParams(parent.Width, (int)(measuredSize.Height * density)); + cell.SetMinimumHeight((int)(measuredSize.Height * density)); + + rvh.Container.RemoveAllViews(); + // cell may sometimes have a parent already + (cell.Parent as FrameLayout)?.RemoveView(cell); + rvh.Container.AddView(cell); + } + } + + public override ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) + { + return new RecyclerViewHolder(new FrameLayout(parent.Context), parent, ListView); } } - protected override void Dispose(bool disposing) + public class RecyclerViewHolder : ViewHolder { - if (!disposing) - return; - this.ItemSelected -= ListViewHandler_ItemSelected; - this.ItemClick -= ListViewHandler_ItemClick; - base.Dispose(disposing); + private readonly IListView listView; + + public FrameLayout Container { get; } + public ViewGroup Parent { get; } + + public RecyclerViewHolder(FrameLayout itemView, ViewGroup parent, IListView listView) + : base(itemView) + { + Container = itemView; + Parent = parent; + this.listView = listView; + + Container.Click += HandleClick; + } + + private void HandleClick(object sender, EventArgs e) + { + listView?.OnSelected(0, this.AdapterPosition); + } } } } \ No newline at end of file diff --git a/src/HotUI.Android/HotUI.Android.csproj b/src/HotUI.Android/HotUI.Android.csproj index 9448ebebbd47..4db0d01c77ea 100644 --- a/src/HotUI.Android/HotUI.Android.csproj +++ b/src/HotUI.Android/HotUI.Android.csproj @@ -42,9 +42,6 @@ - - ..\..\..\..\..\..\Users\jlipsky\.nuget\packages\xamarin.android.support.v7.appcompat\28.0.0.1\lib\monoandroid90\Xamarin.Android.Support.v7.AppCompat.dll - @@ -106,9 +103,14 @@ - + + 28.0.0.1 + + + 28.0.0.1 +