• Android进阶笔记09:Android 万能适配器


    1. Android 万能适配器

         项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter。用起来虽然还不错,但每次都需要去继承一个BaseAdapter,然后实现里面的一大堆方法,而我们每次最关心的无非就是getView方法,其余的方法几乎都是相同代码。这里是不是就可以优化起来呢?在其次,我们在使用Adapter的时候,为了优化性能,常常会创建一个Holder。而Holder里面每次存放的都是View,对Holer的操作无非也就是初始化,绑定数据,复用。这里是不是也可以抽取抽取? 好了,废话不多说,直接上代码:

    (1)首先第一步操作BaseAdapter公共部分抽取:

     1 import java.util.List;
     2 
     3 import android.content.Context;
     4 import android.view.View;
     5 import android.view.ViewGroup;
     6 import android.widget.BaseAdapter;
     7 
     8 /**
     9  * 万能适配器
    10  * 
    11  * @author Mr.Himan
    12  * 
    13  * @param <T> 数据源的数据类型
    14  *            
    15  */
    16    public abstract class CommonAdapter<T> extends BaseAdapter {
    17 
    18     /**
    19      * 上下文
    20      */
    21     protected Context mContext;
    22     /**
    23      * 数据源
    24      */
    25     protected List<T> listDatas;
    26     /**
    27      * Item布局ID
    28      */
    29     protected int layoutId;
    30 
    31     public CommonAdapter(Context context, List<T> listDatas, int layoutId) {
    32         this.mContext = context;
    33         this.listDatas = listDatas;
    34         this.layoutId = layoutId;
    35     }
    36 
    37     @Override
    38     public int getCount() {
    39         return listDatas == null ? 0 : listDatas.size();
    40     }
    41 
    42     @Override
    43     /**
    44      * 获取当前点击的Item的数据时用
    45      * 在onItemClick中 parent.getAdapter().getItem(),获取当前点击的Item的数据
    46      */
    47     public Object getItem(int position) {
    48         return listDatas.get(position);
    49     }
    50 
    51     @Override
    52     public long getItemId(int position) {
    53         return position;
    54     }
    55 
    56     @Override
    57     /**
    58      * 只关心这一个方法
    59      */
    60     public View getView(int position, View convertView, ViewGroup parent) {
    61            ViewHolder holder = ViewHolder.getViewHolder(mContext, convertView,
    62                 parent, layoutId, position);
    63         fillData(holder, position);
    64         return holder.getMConvertView();
    65     }
    66 
    67     /**
    68      * 
    69      * 抽象方法,用于子类实现,填充数据
    70      * @param holder
    71      * @param position
    72      */
    73     protected abstract void fillData(ViewHolder holder, int position);
    74 
    75 }

    (2)第二步Holer的通用化

     1 import android.content.Context;
     2 import android.util.SparseArray;
     3 import android.view.LayoutInflater;
     4 import android.view.View;
     5 import android.view.ViewGroup;
     6 
     7 /**
     8  * 
     9  * @author Mr.Himan Holer的 通用化处理
    10  * 
    11  */
    12 public class ViewHolder {
    13 
    14     /**
    15      * View容器,用于存放Holer中的View
    16      * 照顾下小白 SparseArray 是Android推荐使用的一个优化容器,相当于一个Map<integer,View>  
    17      */
    18     private SparseArray<View> mViews;
    19 
    20     /**
    21      * Item布局View convertView
    22      */
    23     private View mConvertView;
    24 
    25     public ViewHolder(Context context, ViewGroup parent, int layoutId) {
    26         mViews = new SparseArray<View>();
    27         mConvertView = LayoutInflater.from(context).inflate(layoutId, null);
    28         mConvertView.setTag(this);
    29     }
    30 
    31     /**
    32      * 获取ViewHolder
    33      * 
    34      * @param context
    35      *            上下文
    36      * @param convertView
    37      * @param parent
    38      * @param layoutId
    39      *            布局layout Id
    40      * @param position
    41      * @return
    42      */
    43     public static ViewHolder getViewHolder(Context context, View convertView,
    44             ViewGroup parent, int layoutId) {
    45 
    46         if (convertView == null)
    47             return new ViewHolder(context, parent, layoutId);
    48         return (ViewHolder) convertView.getTag();
    49     }
    50 
    51     /**
    52      * 获取Holder中的ItemView
    53      * 
    54      * @param viewId
    55      * @return
    56      */
    57     @SuppressWarnings("unchecked")
    58     public <T extends View> T getView(int viewId) {
    59 
    60         View item = mViews.get(viewId);
    61         if (item == null) {
    62             item = mConvertView.findViewById(viewId);
    63             mViews.put(viewId, item);
    64         }
    65         return (T) item;
    66     }
    67 
    68     /**
    69      * 获取convertView
    70      * 
    71      * @return
    72      */
    73     public View getMConvertView() {
    74         return mConvertView;
    75     }
    76 }

    (3)第三步使用

     1 package com.css.volunteer.adapter;
     2 
     3 import java.util.List;
     4 
     5 import android.content.Context;
     6 import android.widget.TextView;
     7 
     8 import com.css.volunteer.bean.VolTeamItem;
     9 import com.css.volunteer.bitmap.BitmapHelper;
    10 import com.css.volunteer.manager.R;
    11 import com.css.volunteer.view.CustomImageView;
    12 
    13 public class VolTeamAdapter extends CommonAdapter<Bean> {
    14     public VolTeamAdapter(Context context, List<Bean> listDatas,
    15             int layoutId) {
    16         super(context, listDatas, layoutId);
    17     }
    18 
    19     @Override
    20     protected void fillData(ViewHolder holder, int position) {
    21         TextView actNum = holder.getView(R.id.team_item_active_num);
    22         TextView time = holder.getView(R.id.team_item_time);
    23         TextView title = holder.getView(R.id.team_item_title);
    24         CustomImageView icon = holder.getView(R.id.team_item_icon);
    25         Beanitem = listDatas.get(position);
    26         actNum.setText(String.valueOf(item.getActiveSum()) + "个");
    27         time.setText(String.valueOf(item.getTimeSum()) + "h");
    28         title.setText(item.getName());
    29         BitmapHelper.getInstance(context).display(icon, item.getPhoto());
    30     }
    31 
    32 }

    到这里 万事大吉,以后每次写Adaper的时候,无论你的Item布局怎么样,只需要重写一个方法绑定你的数据就OK,能节约不少开发时间。

  • 相关阅读:
    每日日报40
    每日日报39
    每日日报38
    vue 0点定时网络请求
    js reduce
    时间选择器 element
    CTF-WEB:PHP 变量
    CTF-WEB:PHP 反序列化
    Java 异常类与捕获异常
    Java 面向对象:内部类
  • 原文地址:https://www.cnblogs.com/hebao0514/p/5125588.html
Copyright © 2020-2023  润新知