SimpleAdapter真不简单!
????? 作為一名編程初學(xué)者,我總是認(rèn)為自己什么都不會(huì),什么都不行,就算實(shí)現(xiàn)了文檔指定的功能,我永遠(yuǎn)都是覺(jué)得自己寫(xiě)過(guò)的代碼實(shí)在是太爛了,它只是恰巧能夠運(yùn)行而已!它只是在運(yùn)行的時(shí)候恰巧沒(méi)有發(fā)現(xiàn)錯(cuò)誤而已!!一直都是抱著這樣的念頭,但迫于工作進(jìn)度以及工作心情(這點(diǎn)必須承認(rèn),被上頭追著進(jìn)度的感覺(jué)讓人很郁悶),在項(xiàng)目完結(jié)的一段時(shí)間內(nèi)都不想看到自己的代碼!!所以,迫切提醒各位和我一樣的菜鳥(niǎo),不要放過(guò)每一次重構(gòu)和優(yōu)化的機(jī)會(huì),這種優(yōu)化可以是小步驟的,有時(shí)就是代碼結(jié)構(gòu)的一個(gè)優(yōu)化,或者是某個(gè)變量名的修改,并不要求我們從一開(kāi)始就對(duì)結(jié)構(gòu)進(jìn)行優(yōu)化,記住這句話:
????? 程序員只要對(duì)自己的代碼負(fù)責(zé)就行。
????? 自己寫(xiě)過(guò)的代碼遲早是要被人看的,被人用的,所以,它就像是我們?cè)谶@圈子里的名片,無(wú)論我們把自己吹得再牛,一看我們的代碼,就真的是什么餡都清楚了。所以,不要對(duì)自己正在寫(xiě)的代碼馬虎,最后吃虧的是自己。
????? 在結(jié)束項(xiàng)目的某個(gè)進(jìn)度后,就來(lái)寫(xiě)寫(xiě)博客轉(zhuǎn)換一下心情,想起常用控件ListView,于是就來(lái)研究研究它。
??????使用ListView關(guān)鍵的就是適配器,可怕的是,用于ListView的適配器很多。
????? 我們先從名字看似最簡(jiǎn)單其實(shí)不簡(jiǎn)單的SimpleAdapter開(kāi)始。
??????我們先來(lái)看一個(gè)簡(jiǎn)單的例子:
private ListView mListView;private LinearLayout mLayout;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mLayout = new LinearLayout(this);mLayout.setOrientation(LinearLayout.VERTICAL);mListView = new ListView(this);LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT);mLayout.addView(mListView, param);setContentView(mLayout);Map<String, String> keyValuePair = new HashMap<String, String>();keyValuePair.put("Name", "小智");keyValuePair.put("Age", "10");List<Map<String, String>> list = new ArrayList<Map<String, String>>();list.add(keyValuePair);ListAdapter adapter = new SimpleAdapter(this, list,android.R.layout.simple_list_item_2, new String[] { "Name","Age" }, new int[] { android.R.id.text1,android.R.id.text2 });mListView.setAdapter(adapter);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu);return true;}?????
?????我們先從SimpleAdapter的構(gòu)造開(kāi)始。
?????要構(gòu)造一個(gè)SimpleAdapter,需要以下的參數(shù):
1.Context context:上下文,這個(gè)是每個(gè)組件都需要的,它指明了SimpleAdapter關(guān)聯(lián)的View的運(yùn)行環(huán)境,也就是我們當(dāng)前的Activity。
2.List<? extends Map<String, ?>> data:這是一個(gè)由Map組成的List,在該List中的每個(gè)條目對(duì)應(yīng)ListView的一行,每一個(gè)Map中包含的就是所有在from參數(shù)中指定的key。
3.int resource:定義列表項(xiàng)的布局文件的資源ID,該資源文件至少應(yīng)該包含在to參數(shù)中定義的ID。
4.String[] from:將被添加到Map映射上的key。
5.int[] to:將綁定數(shù)據(jù)的視圖的ID跟from參數(shù)對(duì)應(yīng),這些被綁定的視圖元素應(yīng)該全是TextView。
????上面的例子中我們是手動(dòng)的添加視圖,然后使用的是系統(tǒng)默認(rèn)的視圖元素,像是android.R.id.text1。當(dāng)然,我們也可以自定義TextView的樣式,而且,說(shuō)是應(yīng)該全是TextView,也只是應(yīng)該,并不是絕對(duì)的:
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView listView = (ListView) this.findViewById(R.id.list);List<Map<String, ?>> list = new ArrayList<Map<String, ?>>();for (int i = 0; i < 5; i++) {Map<String, String> keyValuePair = new HashMap<String, String>();keyValuePair.put("Text", "Text" + i);keyValuePair.put("Button", "Button" + i);list.add(keyValuePair);}ListAdapter adapter = new SimpleAdapter(this, list, R.layout.listitem,new String[] { "Text", "Button" }, new int[] { R.id.text,R.id.button });listView.setAdapter(adapter);???????
????? 從這里我們可以看到,要想使用ListView,我們應(yīng)用程序的主界面必須包含ListView,然后ListView的內(nèi)容可以自己定義,而不僅僅是TextView。
??????要想知道這是什么回事,我們就要知道SimpleAdapter是如何綁定數(shù)據(jù)到視圖的,這個(gè)過(guò)程我們甚至可以自定義:
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView listView = (ListView) this.findViewById(R.id.list);List<Map<String, String>> list = new ArrayList<Map<String, String>>();for (int i = 0; i < 3; i++) {Map<String, String> keyValuePair = new HashMap<String, String>();keyValuePair.put("text", "text" + i);list.add(keyValuePair);}CustomSimpleAdapter adapter = new CustomSimpleAdapter(this, list,R.layout.listitem);listView.setAdapter(adapter);?
class CustomSimpleAdapter extends SimpleAdapter {private int mResource;private List<? extends Map<String, ?>> mData;public CustomSimpleAdapter(Context context,List<? extends Map<String, ?>> data, int resource) {super(context, data, resource, null, null);this.mResource = resource;this.mData = data;}@Overridepublic View getView(int position, View convertView, ViewGroup group) {LayoutInflater layoutInflater = getLayoutInflater();View view = layoutInflater.inflate(mResource, null);TextView text = (TextView) view.findViewById(R.id.text);text.setText(mData.get(position).get("text").toString());if (position == 2) {text.setTextColor(Color.RED);}return view;}}????
??? ??要想實(shí)現(xiàn)自定義的ListView,最主要的是實(shí)現(xiàn)getView(),因?yàn)镾impleAdapter的數(shù)據(jù)綁定就是發(fā)生在這里。
????? 現(xiàn)在我們可以總結(jié)一下SimpleAdapter的數(shù)據(jù)綁定是怎樣的:利用傳入的view(該view包含ListView每行要渲染的視圖元素)的ResourceID得到該view,然后通過(guò)每個(gè)vie所在的索引,也就是它們的行數(shù),得到data中相應(yīng)內(nèi)容的key,接著就是利用這些key的value填充這些視圖元素,最后返回view作為L(zhǎng)istView每行的內(nèi)容顯示出來(lái)。
????? 由此可見(jiàn),from和to并不是必須的,要想實(shí)現(xiàn)ListView,前三個(gè)參數(shù)才是必要的,也許大家會(huì)看到網(wǎng)上有些例子為了實(shí)現(xiàn)自定義的SimpleAdapter,會(huì)覆寫(xiě)它的許多方法,其實(shí)如果單純只是想要利用SimpleAdapter來(lái)實(shí)現(xiàn)自定義的ListView,只要覆寫(xiě)getView()就行,其他的完全可以交給SimpleAdapter原先的方法來(lái)做,除非我們有特殊的要求。
????? SimpleAdapter并不僅僅用在ListView上,事實(shí)上,Spinner同樣可以使用:
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Spinner spinner = (Spinner) this.findViewById(R.id.spinner);List<Map<String, ?>> list = new ArrayList<Map<String, ?>>();for (int i = 0; i < 5; i++) {Map<String, String> keyValuePair = new HashMap<String, String>();keyValuePair.put("Text", "Text" + i);list.add(keyValuePair);}SimpleAdapter adapter = new SimpleAdapter(this, list,R.layout.listitem, new String[] { "Text" },new int[] { R.id.text });spinner.setAdapter(adapter);}?????
?????? 因?yàn)镾pinner顯示的列表本質(zhì)上就是一個(gè)ListView,所以,和ListView有關(guān)的一切它幾乎都可以使用,這個(gè)還是放在Spinner那時(shí)候再講吧。
????? 原本只是想要將所有的適配器講完,但礙于篇幅有限,所以只好分開(kāi)講,還有,SimpleCursorAdapter由于涉及到數(shù)據(jù)庫(kù),所以打算單獨(dú)拿出來(lái)講。
?
?????
?????
??????
?????
?????
?????
轉(zhuǎn)載于:https://www.cnblogs.com/wenjiang/p/3189082.html
總結(jié)
以上是生活随笔為你收集整理的SimpleAdapter真不简单!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: struts2拦截器遇到的问题
- 下一篇: 36个创意广告海报欣赏