當前位置:
首頁 >
Android进阶笔记09:Android 万能适配器
發布時間:2025/4/14
23
豆豆
生活随笔
收集整理的這篇文章主要介紹了
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,能節約不少開發時間。
轉載于:https://www.cnblogs.com/hebao0514/p/5125588.html
總結
以上是生活随笔為你收集整理的Android进阶笔记09:Android 万能适配器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vdsm的SSL证书验证过程
- 下一篇: 蓝牙 GameKit