簡體   English   中英

我如何將兩個適配器添加到一個listView(Xamarin Android)

[英]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 ,但是在代碼中我發現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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM