[英]how i can add two adapters to one listView (xamarin android)
我有兩個適配器,我想將兩個適配器合並為一個適配器xamarin android
第一個適配器:
private ArrayAdapter _adapter;
第二個適配器:
class HomeScreenAdapterEmp : BaseAdapter<employer>
{
List<employer> items;
Activity context;
int a;
public HomeScreenAdapterEmp(Activity context, List<employer> items)
: base()
{
this.context = context;
this.items = items;
//this.A = c;
}
我想將2個適配器合並為一個適配器
_adapter = new ArrayAdapter(this,
Android.Resource.Layout.SimpleListItem1, TableEmp);//2
listView.Adapter = _adapter;//2
listView.Adapter = new HomeScreenAdapterEmp(this, TableEmp);// 1
listView.ItemClick += ListView_ItemClick;//1
sv.QueryTextChange += Sv_QueryTextChange;
listView.ItemClick += ListView_ItemClick1;
正如MergeAdapter
所建議的那樣,您可以創建MergeAdapter
,但是在代碼中我發現ArrayAdapter
和HomeScreenAdapterEmp
具有相同的數據資源TableEmp
? 根據您的代碼List<employer> items;
,此TableEmp
應該為List<employer>
類型。 這是錯字嗎?
無論如何,您可以像下面這樣創建MergeAdapter
:
public class MergeAdapter : BaseAdapter
{
protected List<IListAdapter> pieces = new List<IListAdapter>();
protected string noItemsText;
public MergeAdapter()
{
}
public void AddAdapter(IListAdapter adapter)
{
pieces.Add(adapter);
adapter.RegisterDataSetObserver(new CascadeDataSetObserver());
}
private class CascadeDataSetObserver : DataSetObserver
{
public override void OnChanged()
{
base.OnChanged();
}
public override void OnInvalidated()
{
base.OnInvalidated();
}
}
public override int Count
{
get
{
int total = 0;
foreach (var piece in pieces)
{
total += piece.Count;
}
if (total == 0 && noItemsText != null)
{
total = 1;
}
return total;
}
}
public override Java.Lang.Object GetItem(int position)
{
foreach (var piece in pieces)
{
int size = piece.Count;
if (position < size)
return (piece.GetItem(position));
position -= size;
}
return null;
}
public override int ViewTypeCount
{
get
{
int total = 0;
foreach (var piece in pieces)
{
total += piece.ViewTypeCount;
}
return (Java.Lang.Math.Max(total, 1));
}
}
public override int GetItemViewType(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;
}
public override long GetItemId(int position)
{
foreach (var piece in pieces)
{
int size = piece.Count;
if (position < size)
{
return (piece.GetItemId(position));
}
position -= size;
}
return (-1);
}
public override 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;
}
return null;
}
public void SetNoItemText(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;
}
return null;
}
}
並像這樣使用它:
ListView lv = FindViewById<ListView>(Resource.Id.lv);
for (int i = 0; i < 100; i++)
{
TableEmp.Add(new employer() { ID = i, Name = "Name " + i });
_stringEmp.Add("Item " + i);
}
var _adapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleListItem1, _stringEmp);
var homeadapter = new HomeScreenAdapterEmp(this, TableEmp);
var mergeadapter = new MergeAdapter();
mergeadapter.AddAdapter(_adapter);
mergeadapter.AddAdapter(homeadapter);
mergeadapter.SetNoItemText("No Item");
lv.Adapter = mergeadapter;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.