Android 萬能介面卡 簡化繁瑣的開發
專案中ListView GridView幾乎是必用的元件,Android也提供一套機制,為這些控制元件繫結資料,那就是Adapter。用起來雖然還不錯,但每次都需要去繼承一個BaseAdapter,然後實現裡面的一大堆方法,而我們每次最關心的無非就是getView方法,其餘的方法幾乎都是相同程式碼。這裡是不是就可以優化起來呢?在其次,我們在使用Adapter的時候,為了優化效能,常常會建立一個Holder。而Holder裡面每次存放的都是View,對Holer的操作無非也就是初始化,繫結資料,複用。這裡是不是也可以抽取抽取? 好了,廢話不多說,直接上程式碼。
首先第一步操作BaseAdapter公共部分抽取:
import java.util.List; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; /** * 萬能介面卡 * * @author Mr.Himan * * @param <T> * 資料來源的資料型別 */ public abstract class CommonAdapter<T> extends BaseAdapter { /** * 上下文 */ protected Context mContext; /** * 資料來源 */ protected List<T> listDatas; /** * Item佈局ID */ protected int layoutId; public CommonAdapter(Context context, List<T> listDatas, int layoutId) { this.mContext = context; this.listDatas = listDatas; this.layoutId = layoutId; } @Override public int getCount() { return listDatas == null ? 0 : listDatas.size(); } @Override /** * 獲取當前點選的Item的資料時用 * 在onItemClick中 parent.getAdapter().getItem(),獲取當前點選的Item的資料 */ public Object getItem(int position) { return listDatas.get(position); } @Override public long getItemId(int position) { return position; } @Override /** * 只關心這一個方法 */ public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.getViewHolder(mContext, convertView, parent, layoutId, position); fillData(holder, position); return holder.getMConvertView(); } /** * * 抽象方法,用於子類實現,填充資料 * @param holder * @param position */ protected abstract void fillData(ViewHolder holder, int position); }
第二步Holer的通用化
import android.content.Context; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * * @author Mr.Himan Holer的通用化處理 * */ public class ViewHolder { /** * View容器,用於存放Holer中的View * 照顧下小白 SparseArray 是Android推薦使用的一個優化容器,相當於一個Map<integer,View> */ private SparseArray<View> mViews; /** * Item佈局View convertView */ private View mConvertView; public ViewHolder(Context context, ViewGroup parent, int layoutId) { mViews = new SparseArray<View>(); mConvertView = LayoutInflater.from(context).inflate(layoutId, null); mConvertView.setTag(this); } /** * 獲取ViewHolder * * @param context * 上下文 * @param convertView * @param parent * @param layoutId * 佈局layout Id * @param position * @return */ public static ViewHolder getViewHolder(Context context, View convertView, ViewGroup parent, int layoutId) { if (convertView == null) return new ViewHolder(context, parent, layoutId); return (ViewHolder) convertView.getTag(); } /** * 獲取Holder中的ItemView * * @param viewId * @return */ @SuppressWarnings("unchecked") public <T extends View> T getView(int viewId) { View item = mViews.get(viewId); if (item == null) { item = mConvertView.findViewById(viewId); mViews.put(viewId, item); } return (T) item; } /** * 獲取convertView * * @return */ public View getMConvertView() { return mConvertView; } }
第三步使用
package com.css.volunteer.adapter; import java.util.List; import android.content.Context; import android.widget.TextView; import com.css.volunteer.bean.VolTeamItem; import com.css.volunteer.bitmap.BitmapHelper; import com.css.volunteer.manager.R; import com.css.volunteer.view.CustomImageView; public class VolTeamAdapter extends CommonAdapter<Bean> { public VolTeamAdapter(Context context, List<Bean> listDatas, int layoutId) { super(context, listDatas, layoutId); } @Override protected void fillData(ViewHolder holder, int position) { TextView actNum = holder.getView(R.id.team_item_active_num); TextView time = holder.getView(R.id.team_item_time); TextView title = holder.getView(R.id.team_item_title); CustomImageView icon = holder.getView(R.id.team_item_icon); Beanitem = listDatas.get(position); actNum.setText(String.valueOf(item.getActiveSum()) + "個"); time.setText(String.valueOf(item.getTimeSum()) + "h"); title.setText(item.getName()); BitmapHelper.getInstance(context).display(icon, item.getPhoto()); } }
到這裡 萬事大吉,以後每次寫Adaper的時候,無論你的Item佈局怎麼樣,只需要重寫一個方法繫結你的資料就OK,能節約不少開發時間。
相關文章
- 使用自定義tld標籤簡化jsp的繁瑣操作JS
- 開發的藝術,化繁為簡
- android萬能介面卡之SuperAdapterAndroidAPT
- Python趣味入門10:推倒繁瑣化煩為簡的推導式Python
- Mybatis-flex代替繁瑣的JPAMyBatisFlex
- 和PLC對配置的繁瑣工序
- shell解決我繁瑣的sqlldr操作SQL
- 低程式碼應用開發:告別繁瑣,實現高效創新
- 直播系統開發步驟繁瑣,你需要注意這四個點
- 告別繁瑣的雲平臺開發!IoT_CLOUD之【百度雲】Cloud
- 開發上雲,化繁為簡 | CIF 論壇精彩看點
- 繁瑣的中國式創業–資料資訊圖創業
- 擺脫redux繁瑣操作,搭建mobx框架Redux框架
- 化繁為簡-優化sql優化SQL
- 前端自動化部署伺服器, 告別繁瑣部署過程前端伺服器
- avue你繁瑣的表格、表單、樹等元件開發的解脫工具,瞭解一下?Vue元件
- Event loop的化繁為簡(一)OOP
- Event loop的化繁為簡(二)OOP
- CRM系統過於繁瑣怎麼辦?
- Istio:微服務開發的終極利器,你還在為繁瑣的通訊和部署流程煩惱嗎?微服務
- 透過外部表改進一個繁瑣的大查詢
- 通過外部表改進一個繁瑣的大查詢
- SOLIDWORKS 2023互動設計新功能——協作處理團隊資料 簡化繁瑣操作Solid
- 告別繁瑣運維管理一身輕鬆運維
- 大模型,化繁為簡歸文心大模型
- 化繁為簡的O2O業務模型模型
- 從語句繁簡和效能優化想到的......優化
- 鴻蒙NEXT開發案例:簡體繁體轉換器鴻蒙
- 學 Flutter,能挽救Android 開發嗎?FlutterAndroid
- android移動開發簡單的開發例項Android移動開發
- 資料介面卡工具的開發
- ModStartCMS萬能建站系統主題開發教程
- Android :“萬能” Activity 重構篇Android
- 基於元件化開發,一個簡單的Android專案框架元件化Android框架
- 辦公自動化入門指南,從此告別繁瑣操作
- 化繁為簡的翻譯機——直譯器模式模式
- 化繁為簡:媒體與大資料的碰撞大資料
- 簡化PHP開發的11個工具PHP