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)"