Adapter的泛型

宗旨:GetView方法放在具体的Activity/Fragment里面实现,其他的均可以复用

/// 
/// 通用适配器:新建GetViewEvent委托+OnGetView方法,在外部实现,在重写GetView方法中调用
/// 
/// 
public class CommonAdapter : BaseAdapter
{
    //要绑定的数据
    private readonly List items;
    //页面上下文
    private readonly Activity context;
    //ListViewItem的布局id
    private readonly int layoutId;
    
    /// 
    /// 委托
    /// 
    public delegate View GetViewEvent(int position, View convertView, ViewGroup parent, T item, ViewHolder viewHolder);

    /// 
    /// 加载item的View事件
    /// 
    public event GetViewEvent OnGetView;

    public CommonAdapter(Activity context, int layoutId, List items)
    {
        this.context = context;
        this.layoutId = layoutId;
        this.items = items;
    }

    public override T this[int position]
    {
        get { return items[position]; }
    }

    public override int Count
    {
        get { return items.Count; }
    }

    public override long GetItemId(int position)
    {
        return position;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        var item = items[position];
        var view = convertView;
        var viewHolder = ViewHolder.Get(context, convertView, parent, layoutId, position);

        if (OnGetView != null)
            return OnGetView(position, convertView, parent, item, viewHolder);
        return view;
    }
}
/// 
/// 通用ViewHolder:保存控件,下拉刷新列表时只重新赋值,不再新建控件(节省内存)
/// Tag属性保证不错位
/// 
public class ViewHolder : Object
{
    private readonly SparseArray views;
    private int position;
    private readonly View ConvertView;

    public ViewHolder(Activity context, ViewGroup parent, int layoutID, int position)
    {
        this.position = position;
        views = new SparseArray();
        ConvertView = context.LayoutInflater.Inflate(layoutID, null);
        ConvertView.Tag = this;
    }

    //单例模式获取对象实例
    public static ViewHolder Get(Activity context, View convertView, ViewGroup parent, int layoutID, int position)
    {
        if (convertView == null)
            return new ViewHolder(context, parent, layoutID, position);
        var holder = (ViewHolder) convertView.Tag;
        holder.position = position;
        return holder;
    }

    public View GetConvertView()
    {
        return ConvertView;
    }

    /// 
    ///  通过ViewID获取控件
    /// 
    /// 
    /// 
    /// 
    public T GetView(int viewId) where T : View
    {
        var view = views.Get(viewId);
        if (view == null)
        {
            view = ConvertView.FindViewById(viewId);
            views.Put(viewId, view);
        }

        return (T) view;
    }
}

MainActivity

protected override void OnCreate(Bundle bundle)
{
    base.OnCreate(bundle);
    SetContentView(Resource.Layout.Main);
    ListView listView = FindViewById(Resource.Id.id_lv_main);
    List  StudentsList =new List();
    StudentsList.Add(new Student()
    {
        Name = "朱泓霖"
    });
    CommonAdapter comAdapter =
        new CommonAdapter(this, Resource.Layout.Item, StudentsList);
    comAdapter.OnGetView += comAdapter_OnGetView;
    listView.Adapter = comAdapter;
}

private View comAdapter_OnGetView(int position, View convertView, ViewGroup parent, Student item, ViewHolder viewHolder)
{
    //通过ViewHolder获取对象并赋值
    viewHolder.GetView(Resource.Id.id_tv_title).Text = item.Name;
    return viewHolder.GetConvertView();
}

你可能感兴趣的:(Adapter的泛型)