Hi all, few months ago I started working on Xamarin Android apps.
It takes a little time because we need to code in C# instead of java, there are few syntactical changes when compared to Native android development. Eg : Few Methods are converted to attributes and handling click events using delegates and stuff like that.
The first thing I did was to develop a sample project to read all the packages installed and display on a custom ListView.
This way we learn :
1. Creating and accessing the views in Xamarin.
2. Creating a custom List Adapter for our Activity.
3. Writing the Activity Class and registering events.
4. Displaying a simple Toast Message.
However creating the Android Project, Deploying the apk on device is all as same as Native Android and IDE gives similar options which feels familiar. I use the Visual Studio for developing this app.
Lets Start :
It takes a little time because we need to code in C# instead of java, there are few syntactical changes when compared to Native android development. Eg : Few Methods are converted to attributes and handling click events using delegates and stuff like that.
The first thing I did was to develop a sample project to read all the packages installed and display on a custom ListView.
This way we learn :
1. Creating and accessing the views in Xamarin.
2. Creating a custom List Adapter for our Activity.
3. Writing the Activity Class and registering events.
4. Displaying a simple Toast Message.
However creating the Android Project, Deploying the apk on device is all as same as Native Android and IDE gives similar options which feels familiar. I use the Visual Studio for developing this app.
Lets Start :
Create an Activity Class MainActivty.cs
The class has following methods :
1. getInstalledApplicationsList - Reads and adds the package name to an ArrayList.
2. importInstalledAppsData - Read app name and app icon from individual packages.
3. successCallBack - Populate the Listview with the retrieved list and register On item click of the list to display the package name as a Toast message.
 using System;
using System.Collections;
using System.Collections.Generic;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Graphics.Drawables;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using PackageName.Src;
namespace PackageName
{
    [Activity(Label = "PackageName", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        int count = 1;
        List<AppDao> appList = new List<AppDao>();
        ArrayList packageName = new ArrayList();
        private ListView lvApps;
        private PackageAdapter packageAdapter;
        private Context mContext;
        private ProgressDialog _progressDialog;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            mContext = this;
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            lvApps = FindViewById<ListView>(Resource.Id.lv_apps);
            _progressDialog = new ProgressDialog(this);
            _progressDialog.SetMessage("Fetching apps list");
            _progressDialog.SetTitle("Please wait...");
            _progressDialog.SetCancelable(false);
            _progressDialog.Show();
            new GetAppsTask(this).Execute();
        }
        public IList<ApplicationInfo> getInstalledApplicationsList(PackageManager pm)
        {
            IList<ApplicationInfo> packages = pm.GetInstalledApplications(PackageInfoFlags.MetaData);
            foreach (var value in packages)
            {
                packageName.Add(value.PackageName);
            }
            return packages;
        }
        public void importInstalledAppsData()
        {
            PackageManager pkgManager = this.ApplicationContext.PackageManager;
            IList<ApplicationInfo> packages = getInstalledApplicationsList(pkgManager);
            int count = 0;
            foreach (ApplicationInfo packageInfo in packages)
            {
                AppDao appDao = new AppDao();
                appDao.AppName = (String)pkgManager.GetApplicationLabel(packageInfo);
                appDao.AppIcon = (Drawable) pkgManager.GetApplicationIcon(packageInfo);
                appList.Add(appDao);
                count++;
            }
        }
        public void successCallBack()
        {
            packageAdapter = new PackageAdapter(this, appList);
            lvApps.Adapter = packageAdapter;
            lvApps.ItemClick += delegate(object sender, AdapterView.ItemClickEventArgs e)
            {
                Toast.MakeText(this, packageName[e.Position].ToString(), ToastLength.Short).Show();
            };
            _progressDialog.Hide();
        }
    }
}
Create an AsyncTask to Fetch all package names
The Task is called from the main activity and once completes the successCallBack of MainActivity is called
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace PackageName.Src
{
    class GetAppsTask : AsyncTask
    {
        private MainActivity _context;
        public GetAppsTask(MainActivity context)
        {
            _context = context;
        }
        protected override void OnPreExecute()
        {
            base.OnPreExecute();
            
        }
        protected override Java.Lang.Object DoInBackground(params Java.Lang.Object[] @params)
        {
            _context.importInstalledAppsData();
            return true;
        }
        protected override void OnPostExecute(Java.Lang.Object result)
        {
            base.OnPostExecute(result);
            _context.successCallBack();
            
        }
    }
}
Create an Model class
The model has two attributes app icon and app name.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.Graphics.Drawables;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
namespace PackageName
{
    class AppDao
    {
        public string AppName { get; set; }
        public Drawable AppIcon { get; set; }
    }
}
Create an Custom List Adapter class
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Object = Java.Lang.Object;
namespace PackageName
{
    class PackageAdapter : BaseAdapter
    {
        List<AppDao> _appsList = new List<AppDao>();
        Activity _activity;
        public PackageAdapter(Activity activity, List<AppDao> appsList)
        {
            this._activity = activity;
            foreach (var value in appsList)
            {
                _appsList.Add(value);
            }
            
        }
        public override Object GetItem(int position)
        {
            return (Object) _appsList[position].ToString();
        }
        public override long GetItemId(int position)
        {
            return position;
        }
        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            var view = convertView ?? _activity.LayoutInflater.Inflate(
            Resource.Layout.List_row, parent, false);
            var appName = view.FindViewById<TextView>(Resource.Id.tv_appName);
            var appImage = view.FindViewById<ImageView>(Resource.Id.iv_app);
            appName.Text = _appsList[position].AppName;
            appImage.SetImageDrawable(_appsList[position].AppIcon);
                
            return view;
        }
        public override int Count
        {
            get { return _appsList.Count; }
        }
    }
}
Create Layout files
The main layout and the row to be inflated in  listview.
Main.axml
