Skip to content Skip to sidebar Skip to footer

How I Can Add Two Adapters To One Listview (xamarin Android)

i have two adapters and i want to merging the 2 adapters into a single adapter xamarin android the first adapter : private ArrayAdapter _adapter; the second adapter : class H

Solution 1:

As Yupi suggested, you can create your MergeAdapter, but in your code I find that your ArrayAdapter and HomeScreenAdapterEmp have the same data resource TableEmp? Based on your code List<employer> items;, this TableEmp should be the type List<employer>. Is this a typo?

Anyway, you can create your MergeAdapter for example like this:

publicclassMergeAdapter : BaseAdapter
{
    protected List<IListAdapter> pieces = new List<IListAdapter>();
    protectedstring noItemsText;

    publicMergeAdapter()
    {
    }

    publicvoidAddAdapter(IListAdapter adapter)
    {
        pieces.Add(adapter);
        adapter.RegisterDataSetObserver(new CascadeDataSetObserver());
    }

    privateclassCascadeDataSetObserver : DataSetObserver
    {
        publicoverridevoidOnChanged()
        {
            base.OnChanged();
        }

        publicoverridevoidOnInvalidated()
        {
            base.OnInvalidated();
        }
    }

    publicoverrideint Count
    {
        get
        {
            int total = 0;
            foreach (var piece in pieces)
            {
                total += piece.Count;
            }
            if (total == 0 && noItemsText != null)
            {
                total = 1;
            }
            return total;
        }
    }

    publicoverride Java.Lang.Object GetItem(int position)
    {
        foreach (var piece in pieces)
        {
            int size = piece.Count;
            if (position < size)
                return (piece.GetItem(position));
            position -= size;
        }
        returnnull;
    }

    publicoverrideint ViewTypeCount
    {
        get
        {
            int total = 0;
            foreach (var piece in pieces)
            {
                total += piece.ViewTypeCount;
            }
            return (Java.Lang.Math.Max(total, 1));
        }
    }

    publicoverrideintGetItemViewType(int position)
    {
        int typeOffset = 0;
        int result = -1;

        foreach (var piece in pieces)
        {
            int size = piece.Count;
            if (position < size)
            {
                result = typeOffset + piece.GetItemViewType(position);
                break;
            }
            position -= size;
            typeOffset += piece.ViewTypeCount;
        }
        return result;
    }

    publicoverridelongGetItemId(int position)
    {
        foreach (var piece in pieces)
        {
            int size = piece.Count;
            if (position < size)
            {
                return (piece.GetItemId(position));
            }
            position -= size;
        }
        return (-1);
    }

    publicoverride View GetView(int position, View convertView, ViewGroup parent)
    {
        foreach (var piece in pieces)
        {
            int size = piece.Count;
            if (position < size)
                return piece.GetView(position, convertView, parent);
            position -= size;
        }
        if (noItemsText != null)
        {
            TextView text = new TextView(parent.Context);
            text.Text = noItemsText;
            return text;
        }
        returnnull;
    }

    publicvoidSetNoItemText(string text)
    {
        noItemsText = text;
    }

    public IListAdapter GetAdapter(int position)
    {
        foreach (var piece in pieces)
        {
            int size = piece.Count;
            if (position < size)
                return piece;
            position -= size;
        }
        returnnull;
    }
}

And use it like this:

ListViewlv= FindViewById<ListView>(Resource.Id.lv);

for (inti=0; i < 100; i++)
{
    TableEmp.Add(newemployer() { ID = i, Name = "Name " + i });
    _stringEmp.Add("Item " + i);
}
var_adapter=newArrayAdapter(this, Android.Resource.Layout.SimpleListItem1, _stringEmp);

varhomeadapter=newHomeScreenAdapterEmp(this, TableEmp);

varmergeadapter=newMergeAdapter();
mergeadapter.AddAdapter(_adapter);
mergeadapter.AddAdapter(homeadapter);
mergeadapter.SetNoItemText("No Item");
lv.Adapter = mergeadapter;

Post a Comment for "How I Can Add Two Adapters To One Listview (xamarin Android)"