Xamarin Forms (4)

Right, so you are one of those guys targeting UWP with their Xamarin Forms app… aand you want to use the new Acrylic brush to make you application stand out. Say no more.

We won’t be using any 3rd party library/package to do this and we’ll be working in the platform specific project; so open up your MainPage.xaml.cs found inside your UWP project. First thing we need to do is grab a reference to your MasterDetail Master page. In my case, the MasterDetail represents my MainPage so things are pretty straight forward.

That will work perfectly with Banner ads but it’s going to fail if you choose to use a Smart Banner. For a Smart Banner, the sizing is a bit more complicated – it depends on the height of your device. You can find out more on AdMob ad unit sizing here.

Ad height

Screen height

32 dp

≤ 400 dp

50 dp

> 400 dp and ≤ 720 dp

90 dp

> 720 dp

Now, dps are density-independent pixels. Do not mistake them for your device’s screen resolution. This unit of measure is what both Android and Xamarin Forms use when it comes to sizes. In order to calculate you screen height in dps we’ll get the screen resolution and divide it by the density; Again this density value isn’t your screen dpi, it’s the scale at which pixels are grouped into dps. For example, for a screen width of 1080 pixels and a density of 3, you will have an actual width of 360dp.

The AdMob renderer

And that’s it, now in your AdMobRenderer you go ahead and specify the new AdBanner size and use the newly implemented method to request the proper height based on the device’s screen. The complete renderer for Android would look like this:

While Xamarin keeps adding features and improves the performance of Xamarin Forms with each and every update, what they offer in terms of cross-platform user controls is not always enough. In my case, I’ve got an RSS reader app which aggregates news articles from different sources and displays them in a ListView like this:

While I like how the app looks, it has a big issue – performance. Even on high-end devices the scrolling is sluggish and on low-end devices it keeps on throwing OutOfMemory exceptions due to the images that are being loaded. So, a change was needed. In this article I’ll only cover the first one – the scrolling performance; we’ll have a look at the OutOfMemory exceptions another time.

The Item template

First thing you need to look at when troubleshooting performance is the ListView ItemTemplate. Any kind of optimization that you can do at this level will have a big impact on the overall performance of your ListView. Look at things like:

reducing the number of XAML elements. The fewer elements to render, the better

same goes for nesting. Avoid nesting elements and creating deep hierarchies. It will take way too long to render them

make sure your ItemSource is an IList and not an IEnumerable collection. IEnumerable doesn’t support random access

don’t change the layout based on your BindingContext. Use a DataTemplateSelector instead

You should already see some improvements in scrolling after making these changes. Next on the list is your caching strategy.

Caching strategy

By default Xamarin uses the RetainElement caching strategy for Android and iOS which means that it will create one instance of your ItemTemplate for each item in your list. Change your ListView’s caching strategy to RecycleElement to reuse containers that are no longer in view instead of creating new elements every time. This will increase performance by removing initialization costs.

If by any chance you’re using a DataTemplateSelector, then you should use the RecycleElementAndDataTemplate caching strategy. For more details on caching strategies you can check Xamarin’s documentation on ListView performance.

Syncfusion ListView

If you got this far and your performance issues aren’t solved, then it’s time looking at other options. In my case, I gave Syncfusion SfListView a try because they’re known for their control suites and they offer their Xamarin controls for free under the same conditions as Visual Studio Community (more or less). To get started head over to Syncfusion’s website an claim your free comunity license if you haven’t already.

Next, you need to add the SfListView package to your project. Syncfusion packages are available through their own NuGet repository. To be able to access it you’ll need to add it to you NuGet sources. A complete guide on how to do that can be found here. One you’ve done that, a simple search for SfListView in NuGet will result in the desired package. Install the package in your core/cross-platform project and in all your platform projects as well; it will automatically pick up the correct DLLs based on your project’s target.

Now that you’ve got everything installed, it’s time to replace the standart ListView. To do so, add the following namespace in your page/view:

And then replace the ListView tag with sflv:ListView, the ListView.ItemTemplate with sflv:SfListView.ItemTemplate and remove the ViewCell from your hierarchy – it’s not needed. Additionaly, if you’ve been using the CachingStrategy property, remove that as well – SfListView recycles elements by default. You should end up with something like this:

One of the first things people think about when developing for a new platform / using a new technology is monetization; and in my case the question is: how easy is it to integrate AdMob? For Xamarin Forms the answer would be: “It depends” – it depends on luck & on the complexity of what you want to achieve; but I will detail this as we move along.

The first thing you need to do is add the required components to your projects. For this walktrough I will be using Visual Studio but it should be relatively the same when using Xamarin Studio. Here, things go separate ways for each of the platforms:

for Android – add Nuget package Xamarin.GooglePlayServices.Ads.Lite

for iOS – add Nuget package Xamarin.Google.iOS.MobileAds

for Windows Phone – download the SDK from here and add it as a reference platform no longer supported

By now, you Android project should no longer be building & you should be receiving a COMPILETODALVIK : UNEXPECTED TOP-LEVEL error. To fix that, go into your Droid project properties, select the Android Options tab and then under Advanced modify the value for the Java Max Heap Size to 1G. Your project should now build without any errors.

Make sure NOTHING interferes with the control. By nothing I mean – overlapping controls, page padding, control margins / spacing, etc. If you have something overlapping the ad control, ads will not display & you won’t receive an error, so be careful.

Next, it’s time to add the custom view renderers; and again, we’ll handle each platform:

Android

Add a new class called AdMobRenderer with the code below. Make sure to keep the ExportRenderer attribute above the namespace, otherwise the magic won’t happen.

That’s it. Now you have ads being served on both platforms. Any comments or suggestions you have leave them in the comments section below.

Update 30 Dec 2017

In this article we looked at displaying Banner ads and hard-coded the view size to 320 x 50 dp. If you’re looking to implement smart banners have a look at this follow-up post: AdMob Smart Banner sizing in Xamarin Forms

Update 21 Jan 2018

I finally made the courage to try and build one of my apps for iOS so I’ve updated this article to work with the latest version of AdMob for Xamarin. I’ve also included the smart sizing code mentioned in the 30 Dec update. Thanks to everyone helping out in the comments section with the iOS implementation.