我如何将两个适配器添加到一个列表视图(Xamarin Android)



我有两个适配器,我想将 2 个适配器合并为一个适配器 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;

正如Yupi建议的那样,您可以创建MergeAdapter,但是在您的代码中,我发现您的ArrayAdapterHomeScreenAdapterEmp具有相同的数据资源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;

最新更新