summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.Android/Renderers/CarouselPageRenderer.cs
blob: 859e78d24360c6a81da0614f403daf78867e8964 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System.ComponentModel;
using Android.Support.V4.View;
using Android.Views;

namespace Xamarin.Forms.Platform.Android
{
	public class CarouselPageRenderer : VisualElementRenderer<CarouselPage>
	{
		ViewPager _viewPager;

		public CarouselPageRenderer()
		{
			AutoPackage = false;
		}

		protected override void Dispose(bool disposing)
		{
			if (disposing && _viewPager != null)
			{
				if (_viewPager.Adapter != null)
					_viewPager.Adapter.Dispose();
				_viewPager.Dispose();
				_viewPager = null;
			}
			base.Dispose(disposing);
		}

		protected override void OnAttachedToWindow()
		{
			base.OnAttachedToWindow();
			var adapter = new CarouselPageAdapter(_viewPager, Element, Context);
			_viewPager.Adapter = adapter;
			_viewPager.AddOnPageChangeListener(adapter);

			adapter.UpdateCurrentItem();

			Element.SendAppearing();
		}

		protected override void OnDetachedFromWindow()
		{
			base.OnDetachedFromWindow();
			Element.SendDisappearing();
		}

		protected override void OnElementChanged(ElementChangedEventArgs<CarouselPage> e)
		{
			base.OnElementChanged(e);

			if (_viewPager != null)
			{
				RemoveView(_viewPager);
				_viewPager.ClearOnPageChangeListeners();
				_viewPager.Dispose();
			}

			_viewPager = new ViewPager(Context);

			AddView(_viewPager);

			_viewPager.OffscreenPageLimit = int.MaxValue;
		}

		protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
		{
			base.OnElementPropertyChanged(sender, e);

			if (e.PropertyName == "CurrentPage" && Element.CurrentPage != null)
			{
				if (!Element.Batched)
					UpdateCurrentItem();
			}
		}

		protected override void OnLayout(bool changed, int l, int t, int r, int b)
		{
			base.OnLayout(changed, l, t, r, b);
			if (_viewPager != null)
			{
				_viewPager.Measure(MeasureSpecFactory.MakeMeasureSpec(r - l, MeasureSpecMode.Exactly), MeasureSpecFactory.MakeMeasureSpec(b - t, MeasureSpecMode.Exactly));
				_viewPager.Layout(0, 0, r - l, b - t);
			}
		}

		protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec)
		{
			_viewPager.Measure(widthMeasureSpec, heightMeasureSpec);
			SetMeasuredDimension(_viewPager.MeasuredWidth, _viewPager.MeasuredHeight);
		}

		void UpdateCurrentItem()
		{
			int index = CarouselPage.GetIndex(Element.CurrentPage);
			if (index < 0 || index >= Element.LogicalChildren.Count)
				return;

			_viewPager.CurrentItem = index;
		}
	}
}