日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SimpleAdapter真不简单!

發(fā)布時(shí)間:2025/7/25 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SimpleAdapter真不简单! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

????? 作為一名編程初學(xué)者,我總是認(rèn)為自己什么都不會(huì),什么都不行,就算實(shí)現(xiàn)了文檔指定的功能,我永遠(yuǎn)都是覺得自己寫過的代碼實(shí)在是太爛了,它只是恰巧能夠運(yùn)行而已!它只是在運(yùn)行的時(shí)候恰巧沒有發(fā)現(xiàn)錯(cuò)誤而已!!一直都是抱著這樣的念頭,但迫于工作進(jìn)度以及工作心情(這點(diǎn)必須承認(rèn),被上頭追著進(jìn)度的感覺讓人很郁悶),在項(xiàng)目完結(jié)的一段時(shí)間內(nèi)都不想看到自己的代碼!!所以,迫切提醒各位和我一樣的菜鳥,不要放過每一次重構(gòu)和優(yōu)化的機(jī)會(huì),這種優(yōu)化可以是小步驟的,有時(shí)就是代碼結(jié)構(gòu)的一個(gè)優(yōu)化,或者是某個(gè)變量名的修改,并不要求我們從一開始就對(duì)結(jié)構(gòu)進(jìn)行優(yōu)化,記住這句話:

????? 程序員只要對(duì)自己的代碼負(fù)責(zé)就行。

????? 自己寫過的代碼遲早是要被人看的,被人用的,所以,它就像是我們?cè)谶@圈子里的名片,無論我們把自己吹得再牛,一看我們的代碼,就真的是什么餡都清楚了。所以,不要對(duì)自己正在寫的代碼馬虎,最后吃虧的是自己。

????? 在結(jié)束項(xiàng)目的某個(gè)進(jìn)度后,就來寫寫博客轉(zhuǎn)換一下心情,想起常用控件ListView,于是就來研究研究它。

??????使用ListView關(guān)鍵的就是適配器,可怕的是,用于ListView的適配器很多。

????? 我們先從名字看似最簡單其實(shí)不簡單的SimpleAdapter開始。

??????我們先來看一個(gè)簡單的例子:

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)造開始。
?????要構(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的樣式,而且,說是應(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è)過程我們甚至可以自定義:

@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,然后通過每個(gè)vie所在的索引,也就是它們的行數(shù),得到data中相應(yīng)內(nèi)容的key,接著就是利用這些key的value填充這些視圖元素,最后返回view作為ListView每行的內(nèi)容顯示出來。

????? 由此可見,from和to并不是必須的,要想實(shí)現(xiàn)ListView,前三個(gè)參數(shù)才是必要的,也許大家會(huì)看到網(wǎng)上有些例子為了實(shí)現(xiàn)自定義的SimpleAdapter,會(huì)覆寫它的許多方法,其實(shí)如果單純只是想要利用SimpleAdapter來實(shí)現(xiàn)自定義的ListView,只要覆寫getView()就行,其他的完全可以交給SimpleAdapter原先的方法來做,除非我們有特殊的要求。

????? 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í)候再講吧。
????? 原本只是想要將所有的適配器講完,但礙于篇幅有限,所以只好分開講,還有,SimpleCursorAdapter由于涉及到數(shù)據(jù)庫,所以打算單獨(dú)拿出來講。

?

?????

?????

??????

?????

?????

?????

轉(zhuǎn)載于:https://www.cnblogs.com/wenjiang/p/3189082.html

總結(jié)

以上是生活随笔為你收集整理的SimpleAdapter真不简单!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。