Started extending android tableview more with CustomTableViewModelRenderer

This commit is contained in:
Kyle Spearrin 2016-08-17 23:57:14 -04:00
parent e3b44ac7d1
commit a42c7a5198

View file

@ -10,20 +10,30 @@ using Bit.App.Controls;
using Bit.App.Enums; using Bit.App.Enums;
using Xamarin.Forms; using Xamarin.Forms;
using Xamarin.Forms.Platform.Android; using Xamarin.Forms.Platform.Android;
using Android.Content;
using AView = Android.Views.View;
using AListView = Android.Widget.ListView;
using Android.Views;
using Android.Util;
[assembly: ExportRenderer(typeof(ExtendedTableView), typeof(ExtendedTableViewRenderer))] [assembly: ExportRenderer(typeof(ExtendedTableView), typeof(ExtendedTableViewRenderer))]
namespace Bit.Android.Controls namespace Bit.Android.Controls
{ {
public class ExtendedTableViewRenderer : TableViewRenderer public class ExtendedTableViewRenderer : TableViewRenderer
{ {
protected override TableViewModelRenderer GetModelRenderer(AListView listView, TableView view)
{
return new CustomTableViewModelRenderer(Context, listView, view);
}
public override SizeRequest GetDesiredSize(int widthConstraint, int heightConstraint) public override SizeRequest GetDesiredSize(int widthConstraint, int heightConstraint)
{ {
var baseSize = base.GetDesiredSize(widthConstraint, heightConstraint); var baseSize = base.GetDesiredSize(widthConstraint, heightConstraint);
var height = ComputeHeight(Control, Convert.ToInt32(baseSize.Request.Width)); var height = ComputeHeight(Control, Convert.ToInt32(baseSize.Request.Width));
return new SizeRequest(new Size(baseSize.Request.Width, height)); return new SizeRequest(new Xamarin.Forms.Size(baseSize.Request.Width, height));
} }
private int ComputeHeight(global::Android.Widget.ListView listView, int width) private int ComputeHeight(AListView listView, int width)
{ {
var adapter = listView.Adapter; var adapter = listView.Adapter;
var totalHeight = listView.PaddingTop + listView.PaddingBottom; var totalHeight = listView.PaddingTop + listView.PaddingBottom;
@ -38,5 +48,63 @@ namespace Bit.Android.Controls
return totalHeight + (listView.DividerHeight * (adapter.Count - 1)); return totalHeight + (listView.DividerHeight * (adapter.Count - 1));
} }
private class CustomTableViewModelRenderer : TableViewModelRenderer
{
private readonly TableView _view;
private readonly AListView _listView;
public CustomTableViewModelRenderer(Context context, AListView listView, TableView view)
: base(context, listView, view)
{
_view = view;
_listView = listView;
}
private ITableViewController Controller => _view;
public override AView GetView(int position, AView convertView, ViewGroup parent)
{
var baseView = base.GetView(position, convertView, parent);
bool isHeader, nextIsHeader;
GetCellPosition(position, out isHeader, out nextIsHeader);
if(isHeader)
{
baseView.SetBackgroundColor(Xamarin.Forms.Color.Transparent.ToAndroid());
}
else
{
baseView.SetBackgroundColor(Xamarin.Forms.Color.Red.ToAndroid());
}
return baseView;
}
private void GetCellPosition(int position, out bool isHeader, out bool nextIsHeader)
{
isHeader = false;
nextIsHeader = false;
var model = Controller.Model;
var sectionCount = model.GetSectionCount();
for(var sectionIndex = 0; sectionIndex < sectionCount; sectionIndex++)
{
var size = model.GetRowCount(sectionIndex) + 1;
if(position == 0)
{
isHeader = true;
nextIsHeader = size == 0 && sectionIndex < sectionCount - 1;
}
if(position < size)
{
nextIsHeader = position == size - 1;
}
position -= size;
}
}
}
} }
} }