Error: Only the original thread that created a view hierarchy can touch its views in Xamarin

Issue

I am getting an error error: Only the original thread that created a view hierarchy can touch its views

in line

BookingAdapter expListAdapter  new BookingAdapter (this, listDataHeader,  listDataChild);
try{
explistView.SetAdapter (expListAdapter);
explistView.SetGroupIndicator (null);
}
catch(Exception e) {
Toast.MakeText (this,e+"",ToastLength.Long).Show();
}

and here is my piece of code

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;
using System.ServiceModel.Web;
using SalonServices;
using System.ServiceModel;

namespace PariSalon
{
[Activity (Label  "BookingRequest")]           
public class BookingRequest : Activity
{
    public List<GetServices> listDataHeader;
    public List<GetServices> services;
    Dictionary<GetServices, List<String>> listDataChild;
    ExpandableListView explistView;
    public static readonly EndpointAddress EndPoint  new EndpointAddress("http://xxx.xxx.Xx.xx/SalonService/SalonServices.svc");
    //public static readonly EndpointAddress EndPoint  new EndpointAddress("http://xxxx");
    private SalonServicesClient serviceClient;

    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        SetContentView(Resource.Layout.Booking_request);
        InitializeSalonServiceClient();
        Button submit  FindViewById<Button> (Resource.Id.button2);


        //string userid  "1";
        //serviceClient.GetServicesForUserAsync (userid);
        string userid  "1";
        serviceClient.GetServicesForUserAsync (userid);
        //serviceClient.GetServicesForUserAsync (userid);

        submit.Click + delegate {
            Intent intent  new Intent(this, typeof(Booking_Request_sent));
            StartActivity(intent);
        };


        // Create your application here
        /*          

        explistView.SetOnGroupClickListener( new OnGroupClickListener());

//Catch click event attempt 2
        explistView.GroupClick + (object pobjSender,   ExpandableListView.GroupClickEventArgs pArgs) >
        {
            int len  expListAdapter.GroupCount;
            for(int i0;i<len;i++)
            {

                if(i!groupPosition)
                {
                    explistView.CollapseGroup(i);
                }
                if(igroupPosition){
                    if(explistView.IsGroupExpanded(groupPosition)){
                        explistView.CollapseGroup(groupPosition);
                    }
                    else {
                        explistView.ExpandGroup(groupPosition);
                    }


                }
            }
        };*/
    }
    private void InitializeSalonServiceClient()
    {
        BasicHttpBinding binding  CreateBasicHttp();
        serviceClient  new SalonServicesClient(binding, EndPoint);
        //serviceClient.GetServicesForUserCompleted + GetServicesForUserCompleted;
        //serviceClient.GetProductDetailsCompleted + GetProductDetailsCompleted;
        serviceClient.GetServicesForUserCompleted + GetServicesForUserCompleted;

    }


    private void GetServicesForUserCompleted(object sender, GetServicesForUserCompletedEventArgs getServiceDataCompletedEventArgs)
    {
        string msg  null;

        if (getServiceDataCompletedEventArgs.Error ! null)
        {
            msg  getServiceDataCompletedEventArgs.Error.Message;
        }
        else if (getServiceDataCompletedEventArgs.Cancelled)
        {
            msg  "Request was cancelled.";
        }
        else
        {
            services  new List<GetServices>(getServiceDataCompletedEventArgs.Result);
            prepareListData ();
            explistView  FindViewById<ExpandableListView> (Resource.Id.expandableselectservicetype);
            BookingAdapter expListAdapter  new BookingAdapter (this, listDataHeader, listDataChild);
            try{
                explistView.SetAdapter (expListAdapter);
                explistView.SetGroupIndicator (null);
            }
            catch(Exception e) {
                Toast.MakeText (this,e+"",ToastLength.Long).Show();
            }


        }

    }

    private static BasicHttpBinding CreateBasicHttp()
    {
        BasicHttpBinding binding  new BasicHttpBinding
        {
            Name  "basicHttpBinding",
            MaxBufferSize  2147483647,
            MaxReceivedMessageSize  2147483647
        };
        TimeSpan timeout  new TimeSpan(0, 0, 50);
        binding.SendTimeout  timeout;
        binding.OpenTimeout  timeout;
        binding.ReceiveTimeout  timeout;
        return binding;
    }


    private void prepareListData() {
        listDataHeader  new List<GetServices>();
        listDataChild  new Dictionary<GetServices, List<String>>();
        listDataHeader.Clear ();
        if (services ! null) {
            foreach (GetServices pd in services) {
                listDataHeader.Add (pd);
            }
            // Adding child data
            //listDataHeader.Add("Top 250/n");
            //listDataHeader.Add("Now Showing");
            //listDataHeader.Add("Coming Soon..");      

            List<String> childLabel  new List<String> ();
            childLabel.Add ("Date :");
            childLabel.Add ("Time :");
            childLabel.Add ("User :");
            childLabel.Add ("Second User:");
            childLabel.Add ("Status :");
            childLabel.Add ("Cancel ");

            listDataChild.Add (listDataHeader.ElementAt (0), childLabel); // Header, Child data
            listDataChild.Add (listDataHeader.ElementAt (1), childLabel);
            listDataChild.Add (listDataHeader.ElementAt (2), childLabel);
        }
    }


}
}

I have another adapter class but I think the error is only in this class. How can I solve this problem. Can any one please help me to solve this problem.

Solution

You’re calling GetServicesForUserCompleted method from SalonServicesClient on worker thread. Invoke it on the UI thread instead.

Answered By – a.ch.

Leave a Comment