教你打造一個(gè)萬能適配器

最近項(xiàng)目中 經(jīng)常用listView和GridView 抄肖,可以說是項(xiàng)目中Listview GridView幾乎是必用的組件咒锻,Android也提供一套機(jī)制府框,為這些控件綁定數(shù)據(jù)比规,那就是Adapter 最近抽了時(shí)間,自己也打造了一個(gè)萬能的適配器

看我們之前的一些寫法:

public class ImageViewAdapter2 extends RecyclerView.Adapter {PRivate SweatQuestryModel deviceDataBean; private Context context; private ArrayList urls = null; public ImageViewAdapter2(Context context, SweatQuestryModel deviceDataBean) { this.context = context; this.deviceDataBean = deviceDataBean; initImageUrl(deviceDataBean); } private void initImageUrl(SweatQuestryModel deviceDataBean) { urls = new ArrayList<>(); if(urls != null){ urls.addAll(deviceDataBean.getList()); } } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_imageview, null); MyViewHolder holder = new MyViewHolder(view); return holder; } @Override public void onBindViewHolder(MyViewHolder holder, final int position) { GlideUtil.loadNetImg2(context, holder.image, urls.get(position) , R.drawable.default_square_image); holder.image.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bundle bundle = new Bundle(); bundle.putStringArrayList("imgUrls",urls); bundle.putInt("position", position); bundle.putInt("type", PictureActivity.TYPE_NET_IMG); ActivityUtils.showActivity(context, PictureActivity.class, bundle); } }); } @Override public int getItemCount() { return deviceDataBean == null ? 0 : 9; } class MyViewHolder extends RecyclerView.ViewHolder { ImageView image; public MyViewHolder(View itemView) { super(itemView); image = (ImageView) itemView.findViewById(R.id.sweat_recycler_image); } } }

這樣用起來雖然還不錯(cuò)拦英,但每次都需要去繼承一個(gè)BaseAdapter蜒什,然后實(shí)現(xiàn)里面的一大堆方法,而我們每次最關(guān)心的無非就是getView方法疤估,其余的方法幾乎都是相同代碼灾常。這里是不是就可以優(yōu)化起來呢?在其次铃拇,我們?cè)谑褂肁dapter的時(shí)候钞瀑,為了優(yōu)化性能,常常會(huì)創(chuàng)建一個(gè)Holder慷荔。而Holder里面每次存放的都是View雕什,對(duì)Holer的操作無非也就是初始化,綁定數(shù)據(jù)显晶,復(fù)用贷岸。這里是不是也可以抽取抽取磷雇? 如果我們封裝后:

/** * 類功能描述:
*v Viewholder * @author yuyahao * @version 1.0 修改時(shí)間:
修改備注:
*/ public class VolTeamAdapter extends CommonAdapter { private Context context; public VolTeamAdapter(Context context, List 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); ImageView icon = holder.getView(R.id.team_item_icon); Bean item = listDatas.get(position); actNum.setText(String.valueOf(item.getActiveSum()) + "個(gè)"); time.setText(String.valueOf(item.getTimeSun()) + "h"); title.setText(item.getName()); GlideUtil.loadNetImgC(context,icon, item.getPhoto(), R.drawable.bg_app_title); } }

這樣是不是簡(jiǎn)單多了偿警。每次 寫adapter都可以這樣用。

第一步:構(gòu)造 BaseAdapter

** * 類功能描述:
*v 使用 * @author yuyahao * @version 1.0 修改時(shí)間:
修改備注:
*/ public class VolTeamAdapter extends CommonAdapter { private Context context; public VolTeamAdapter(Context context, List listDatas, int layoutId) { super(context, listDatas, layoutId); this.context = context; } @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); ImageView icon = holder.getView(R.id.team_item_icon); Bean item = listDatas.get(position); actNum.setText(String.valueOf(item.getActiveSum()) + "個(gè)"); time.setText(String.valueOf(item.getTimeSun()) + "h"); title.setText(item.getName()); GlideUtil.loadNetImgC(context,icon, item.getPhoto(), R.drawable.bg_app_title); } }

好了唯笙,別賣關(guān)子了螟蒸,直接上全部代碼。

/** * 類功能描述:
*v Viewholder * @author yuyahao * @version 1.0 修改時(shí)間:
修改備注:
*/ public abstract class CommonAdapter extends BaseAdapter { /*** 上下文的Context*/ protected Context mContext; /*** list的數(shù)據(jù)*/ protected List listDatas; /** Item布局ID*/ protected int layoutId; public CommonAdapter(Context context, List listDatas, int layoutId) { this.mContext = context; this.listDatas = listDatas; this.layoutId = layoutId; } @Override public int getCount() { return listDatas == null ? 0 : listDatas.size(); } /** * 獲取當(dāng)前點(diǎn)擊的Item的數(shù)據(jù)時(shí)用 * 在onItemClick中 parent.getAdapter().getItem(),獲取當(dāng)前點(diǎn)擊的Item的數(shù)據(jù) */ @Override public Object getItem(int position) { return listDatas.get(position); } @Override public long getItemId(int position) { return position; } /** *加載每一個(gè)Item崩掘,該方法是最關(guān)鍵的 */ @ 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(); } /** * * 抽象方法七嫌,用于子類實(shí)現(xiàn),填充數(shù)據(jù) * @param holder * @param position */ protected abstract void fillData(ViewHolder holder, int position); }

第二步Holer的通用化

/** * 類功能描述:
*v Viewholder * @author yuyahao * @version 1.0 修改時(shí)間:
修改備注:
*/ public class ViewHolder { private int mPosition; /** * View容器呢堰,用于存放Holer中的View * 據(jù)網(wǎng)上說是 SparseArray是這樣的 * SparseArray 是Android推薦使用的一個(gè)優(yōu)化容器抄瑟,相當(dāng)于一個(gè)Map */ private SparseArray mViews; /** * Item布局View convertView */ private View mConvertView; public ViewHolder(Context context, ViewGroup parent, int layoutId) { mViews = new SparseArray(); mConvertView = LayoutInflater.from(context).inflate(layoutId, null); mConvertView.setTag(this); } /** * 獲取ViewHolder * @param context * 上下文 * @param convertView * @param parent * @param layoutId * 布局layout Id * @param * @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(); } public ViewHolder(Context context, ViewGroup parent, int layoutId, int position) { this.mViews = new SparseArray(); this.mPosition = position; this.mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); this.mConvertView.setTag(this); } /** * 拿到一個(gè)ViewHolder對(duì)象 * @param context * @param convertView * @param parent * @param layoutId * @param position * @return */ public static ViewHolder getViewHolder(Context context, View convertView, ViewGroup parent, int layoutId, int position) { if (null == convertView) { return new ViewHolder(context, parent, layoutId, position); } else { ViewHolder holder = (ViewHolder) convertView.getTag(); holder.mPosition = position; return holder; } } /** * 獲取Holder中的ItemView * @param viewId * @return */ @SuppressWarnings("unchecked") public T getView(int viewId) { View item = mViews.get(viewId); if (item == null) { item = mConvertView.findViewById(viewId); mViews.put(viewId, item); } return (T) item; } /** * 獲取convertView***/ public View getMConvertView() { return mConvertView; } }

這樣已經(jīng)寫完。

第三步使用

/** * 類功能描述:
*v 使用 * @author yuyahao * @version 1.0 修改時(shí)間:
修改備注:
*/ public class VolTeamAdapter extends CommonAdapter { private Context context; public VolTeamAdapter(Context context, List listDatas, int layoutId) { super(context, listDatas, layoutId); this.context = context; } @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); ImageView icon = holder.getView(R.id.team_item_icon); Bean item = listDatas.get(position); actNum.setText(String.valueOf(item.getActiveSum()) + ""); time.setText(String.valueOf(item.getTimeSun()) + ""); title.setText(item.getName()); GlideUtil.loadNetImgC(context,icon, item.getPhoto(), R.drawable.bg_app_title); } }

mainActivity:

public class MyTextActivity extends BaseActivity{ private Context cnt; @Bind(R.id.lv_list) ListView lv_list; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); addViewFillInRoot(R.layout.ctivity_mytext); ButterKnife.bind(this); cnt = this; initView(); } private void initView() { try { List list = DataTest.getMyTestList(); VolTeamAdapter volTeamAdapter = new VolTeamAdapter(cnt,list,R.layout.my_listr); lv_list.setAdapter(volTeamAdapter); } catch (Exception e) { e.printStackTrace(); } } }

xml


效果圖:

歡迎加入技術(shù)交流QQ群:364595326

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市皮假,隨后出現(xiàn)的幾起案子鞋拟,更是在濱河造成了極大的恐慌,老刑警劉巖惹资,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贺纲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡褪测,警方通過查閱死者的電腦和手機(jī)猴誊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侮措,“玉大人懈叹,你說我怎么就攤上這事》衷” “怎么了澄成?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)畏吓。 經(jīng)常有香客問我墨状,道長(zhǎng),這世上最難降的妖魔是什么菲饼? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任肾砂,我火速辦了婚禮,結(jié)果婚禮上宏悦,老公的妹妹穿的比我還像新娘镐确。我一直安慰自己,他們只是感情好肛根,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布辫塌。 她就那樣靜靜地躺著,像睡著了一般派哲。 火紅的嫁衣襯著肌膚如雪臼氨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天芭届,我揣著相機(jī)與錄音储矩,去河邊找鬼。 笑死褂乍,一個(gè)胖子當(dāng)著我的面吹牛持隧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逃片,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼屡拨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呀狼,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤裂允,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后哥艇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绝编,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年貌踏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了十饥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡祖乳,死狀恐怖逗堵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眷昆,我是刑警寧澤砸捏,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站隙赁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梆暖。R本人自食惡果不足惜伞访,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望轰驳。 院中可真熱鬧厚掷,春花似錦、人聲如沸级解。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勤哗。三九已至抡爹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芒划,已是汗流浹背冬竟。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留民逼,地道東北人泵殴。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拼苍,于是被迫代替她去往敵國(guó)和親笑诅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容