Android萬能適配器(一)封裝ViewHolder,androidviewholder
封裝ViewHolder
首先介紹下ViewHolder。
正常開發中ViewHolder並不是必須的,可以說使用ViewHolder一般會讓開發更加複雜,但是為什麼我們還是要使用ViewHolder,原因很簡單ViewHolder會提供者運行效率,在不用ViewHolder的時候,每次調用getView方法,都會通過findViewById尋找布局裡的控制項,這個是比較耗費時間的,使用ViewHolder可以把控制項儲存到ViewHolder裡面,在使用時候直接從ViewHolder取就ok。這樣能提高程式效率。
簡單使用ViewHolder
ViewHolder使用非常簡單,一般在Adapter內部定義一個ViewHolder類,本章使用單個TextView作為demo。
/** * 定義ViewHolder類 * @author IsCoding */private final class ViewHolder {TextView mTextView;}
這樣就實現了一個簡單的ViewHolder,不過這樣有個問題就是每個Adapter都需要自訂一個ViewHolder類,寫起來非常麻煩
封裝 ViewHolder
簡單分析ViewHolder封裝。ViewHolder內部正常是儲存每個頁面控制項的索引,那麼封裝時候我們可以使用容器把每個Item布局中的所有控制項儲存到這個容器裡面,每次使用時候從容易查詢.這裡用Map可以實現。也可以使用SparseArray替換,SparseArray比Map效率更高。
/** * 封裝ViewHolder工具類 * @author IsCoding */public class ViewHolder {private final HashMap<Integer,View> mViews;private View mConvertView;public ViewHolder(Context context, ViewGroup parent, int layoutId,int position) {this.mViews = new HashMap<Integer,View>();mViews.clear();mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,false);mConvertView.setTag(this);}public static ViewHolder get(Context context, View convertView,ViewGroup parent, int layoutId, int position) {if (convertView == null) {return new ViewHolder(context, parent, layoutId, position);}return (ViewHolder) convertView.getTag();} public <T extends View> T getView(int viewId) {View view = mViews.get(viewId);if (view == null) {view = mConvertView.findViewById(viewId);<pre name="code" class="java">
下面看一下使用封裝後的ViewHolder 的效果
package com.iscoding.mobile.adaptertest.test2.adapter;import java.util.List;import com.iscoding.mobile.adaptertest.R;import com.iscoding.mobile.adaptertest.test2.ViewHolder;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class MyAdapter2 extends BaseAdapter {private LayoutInflater mInflater;private Context mContext;private List<String> mDatas;public MyAdapter2(Context context, List<String> mDatas) {mInflater = LayoutInflater.from(context);this.mContext = context;this.mDatas = mDatas;}@Overridepublic int getCount() {return mDatas.size();}@Overridepublic Object getItem(int position) {return mDatas.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// 執行個體化一個viewHolderViewHolder viewHolder = ViewHolder.get(mContext, convertView, parent,R.layout.item_1, position);// 通過getView擷取控制項TextView tv = viewHolder.getView(R.id.text_title);// 使用tv.setText(mDatas.get(position));return viewHolder.getConvertView();}}
使用封裝好的ViewHolder 已經使代碼看起來簡潔非常多了。
著作權聲明:本文為博主原創文章,轉載請註明出處。 部落格地址:http://blog.csdn.net/androidiscoding