日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

分開adapter的getView方法代碼,寫出個(gè)清爽的adapter

 月冷星河 2016-05-03

一、前言

習(xí)慣很多時(shí)候決定了我們的做法,而做法一定程度上又在鞏固我們的習(xí)慣。細(xì)想,這是一件很恐怖的事。所以很多時(shí)候要學(xué)會(huì)用一些新的方式去改變我們的習(xí)慣。做技術(shù),亦如此。很多時(shí)候,我們寫一個(gè)listview的adapter,總是會(huì)按照我們自己習(xí)慣的方式去寫,布局簡(jiǎn)單的還好,布局一復(fù)雜起來(lái),你就會(huì)看到你的類里面代碼幾百甚至上千行,這樣維護(hù)起來(lái)是很可怕的。而我個(gè)人的編程風(fēng)格是寧愿類多而不愿一個(gè)類里面的代碼多。所以很多東西都喜歡抽離出去,盡量讓代碼之間具有的耦合性降到最低。今天這里要介紹的一種方式是將adapter里面的getview代碼分離出一個(gè)類去,不要放在getview里面。讓你的adapter變得更加清爽,維護(hù)起來(lái)更加清晰有效,這種方法開始是看到一個(gè)github上面的國(guó)外大神寫的,經(jīng)過(guò)理解,自己也寫了一下,放在這里大家學(xué)習(xí)下。


二、實(shí)現(xiàn)

首先講一下思想,看一下getView這個(gè)方法先,這里其實(shí)是通過(guò)inflate返回了一個(gè)view,對(duì)了,這里的view是在我們寫的一個(gè)XML的文件解析出來(lái)的。所以我們能不能這樣做,自定義一個(gè)view,而這個(gè)自定義的view就是我們那個(gè)listview的一個(gè)item的布局,然后這個(gè)view就單獨(dú)作為一個(gè)類存在著,只要getView用到了,我們就new出這個(gè)自定義的view,讓它return。確實(shí),完全可以這樣做的。而關(guān)于這種方式的好處,后面還會(huì)介紹到。


現(xiàn)在思想有了,具體怎樣實(shí)現(xiàn)比較合理,就可以小思考下咯。盡量設(shè)計(jì)得通用,方便最好。

上代碼解釋:

1、首先定義一個(gè)接口,用來(lái)綁定控件,這里用泛型是為了通用性。

package com.kroc.adapter;/** * 綁定控件接口 * @author 林楷鵬 * @date 2014-12-9 下午9:45:25 */public interface IAdapterView { public void bind(int position, T item);}


2、listview的一個(gè)item布局,簡(jiǎn)簡(jiǎn)單單


3、根據(jù)上面布局定義一個(gè)view,這個(gè)view就是我們一個(gè)listview的item布局,這里實(shí)現(xiàn)IAdapterView接口,關(guān)于這點(diǎn)好處,后面還會(huì)介紹

package com.kroc.adapter;import android.content.Context;import android.content.Intent;import android.view.View;import android.widget.Button;import android.widget.LinearLayout;import android.widget.TextView;import com.kroc.adapterdemo.R;import com.kroc.main.FoodBO;import com.kroc.main.TestActivity;/** * item布局對(duì)應(yīng)的view * @author 林楷鵬 * @date 2014-12-9 下午9:49:01 */public class FoodListItemView extends LinearLayout implements IAdapterView{ private Context mContext; private TextView nameTxtv; private TextView numTxtv; private Button getBtn; private FoodBO mFoodBO; public FoodListItemView(Context context) { super(context); this.mContext = context; init(); } private void init(){ View.inflate(getContext(), R.layout.lv_item_food, this); nameTxtv = (TextView)findViewById(R.id.item_food_name_txtv); numTxtv = (TextView)findViewById(R.id.item_food_num_txtv); getBtn = (Button)findViewById(R.id.item_food_get_btn); getBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(mContext, TestActivity.class); intent.putExtra('food', mFoodBO); mContext.startActivity(intent); } }); } @Override public void bind(int position, FoodBO foodBO) { mFoodBO = foodBO; nameTxtv.setText(foodBO.getFoodName()); numTxtv.setText(foodBO.getFoodNum() + '份'); }}


4、然后這里就是適配器,注意一下,這里是為了顯示這種做法的簡(jiǎn)潔性,我特意寫了兩個(gè)布局,就是說(shuō)一個(gè)listview的item可以有不同的布局,往往用傳統(tǒng)方式寫的話,代碼會(huì)更多,但是在這里可以看到,我的getView里面就是短短幾行代碼,如此簡(jiǎn)潔。(其他代碼點(diǎn)擊下面下載代碼去看)。這里可以回想一下,我們平時(shí)做這種有多種布局的item是如何做的,是不是把所有的view加載綁定都寫到getView里面了,那樣是不是讓你的代碼變得格外臃腫不堪呢?而通過(guò)這種方式,你就可以將不同的布局寫到不同的類中去,需要用到的時(shí)候再new出來(lái)就行。

package com.kroc.adapter;import android.content.Context;import android.view.View;import android.view.ViewGroup;import com.kroc.main.FoodBO;/** * @author 林楷鵬 * @description 食物列表適配 * @create 2014-11-24下午2:37:25 * */public class MyAdapter extends CommonBaseAdapter { private static final int ITEM_VIEW_TYPE_NUM = 2; private static final int ITEM_VIEW_TYPE_FOOD = 0; private static final int ITEM_VIEW_TYPE_IMAGE = 1; public MyAdapter(Context context) { super(context); } @Override public int getViewTypeCount() { return ITEM_VIEW_TYPE_NUM; } @Override public int getItemViewType(int position) { if(position % 3 == 0){//為了顯示不同item布局 return ITEM_VIEW_TYPE_FOOD; }else{ return ITEM_VIEW_TYPE_IMAGE; } } @Override public View getView(int position, View convertView, ViewGroup parent) { IAdapterView orderDetail = null; if(position % 3 == 0){ orderDetail = new FoodListItemView(mContext); }else{ orderDetail = new ImageListItemView(mContext); } orderDetail.bind(position, mList.get(position)); return (View) orderDetail; }}

關(guān)于定義接口的好處:泛型是一個(gè)好處,可以適配不同的數(shù)據(jù)類型,另外,可以將要顯示的item布局都實(shí)現(xiàn)接口,這樣的話就可以實(shí)現(xiàn)多態(tài)了。下面看看效果圖,從下面的圖片可以看到確實(shí)也實(shí)現(xiàn)了我們要的效果。

另外這樣做還有一個(gè)好處,就是代碼的復(fù)用性,假如你有兩個(gè)地方都用到同一個(gè)布局,那么通過(guò)這種方式,你就可以在兩個(gè)地方new兩個(gè)view就行,不用在兩個(gè)地方將代碼碼兩遍,那樣很煩的。




其他代碼不做多解釋,還是老規(guī)矩。要了解的點(diǎn)擊代碼下載

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多