美文网首页
Adapter的泛型

Adapter的泛型

作者: Lulus | 来源:发表于2018-01-02 20:30 被阅读0次

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

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

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

    public CommonAdapter(Activity context, int layoutId, List<T> 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;
    }
}
/// <summary>
/// 通用ViewHolder:保存控件,下拉刷新列表时只重新赋值,不再新建控件(节省内存)
/// Tag属性保证不错位
/// </summary>
public class ViewHolder : Object
{
    private readonly SparseArray<View> views;
    private int position;
    private readonly View ConvertView;

    public ViewHolder(Activity context, ViewGroup parent, int layoutID, int position)
    {
        this.position = position;
        views = new SparseArray<View>();
        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;
    }

    /// <summary>
    ///  通过ViewID获取控件
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="viewId"></param>
    /// <returns></returns>
    public T GetView<T>(int viewId) where T : View
    {
        var view = views.Get(viewId);
        if (view == null)
        {
            view = ConvertView.FindViewById<T>(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<ListView>(Resource.Id.id_lv_main);
    List<Student>  StudentsList =new List<Student>();
    StudentsList.Add(new Student()
    {
        Name = "朱泓霖"
    });
    CommonAdapter<Student > comAdapter =
        new CommonAdapter<Student>(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<TextView>(Resource.Id.id_tv_title).Text = item.Name;
    return viewHolder.GetConvertView();
}

相关文章

  • Adapter的泛型

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

  • Android中泛型使用实例

    一,通用Adapter 1,Example 2,分析: a,这里使用了泛型类泛型类(Java Class),它可以...

  • Java 泛型的见解

    前言 写 RecyclerView 的 Adapter 时,感觉到了泛型理解不够深刻,也不够熟练,看了几天的泛型文...

  • 泛型的作用及使用场景

    Android使用泛型的地方很多,比如集成自BaseAdapter实现封装的Adapter,对常用操作进行封装,但...

  • Android:控件ListView

    ListView数据的展示主要依靠是Adapter数据适配器 ArrayAdapter:支持泛型操作,最简单的一个...

  • Kotlin进阶 - 泛型

    在Android开发中我们经常用到泛型,如:List、Map、Set、Adapter等,那么在Kotlin中同样支...

  • 泛型 & 注解 & Log4J日志组件

    掌握的知识 : 基本用法、泛型擦除、泛型类/泛型方法/泛型接口、泛型关键字、反射泛型(案例) 泛型 概述 : 泛型...

  • 【泛型】通配符与嵌套

    上一篇 【泛型】泛型的作用与定义 1 泛型分类 泛型可以分成泛型类、泛型方法和泛型接口 1.1 泛型类 一个泛型类...

  • Java 泛型

    泛型类 例如 泛型接口 例如 泛型通配符 泛型方法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型上下边...

  • Web笔记-基础加强

    泛型高级应用 自定义泛型方法 自定义泛型类 泛型通配符? 泛型的上下限 泛型的定义者和泛型的使用者 泛型的定义者:...

网友评论

      本文标题:Adapter的泛型

      本文链接:https://www.haomeiwen.com/subject/kjwqnxtx.html