Android自定義實(shí)現(xiàn)BaseAdapter的普通實(shí)現(xiàn)
對(duì)于ListVie來(lái)說,數(shù)據(jù)項(xiàng)的設(shè)置有很多種方式,而自定義實(shí)現(xiàn)BaseAdapter是最經(jīng)常用的了,那么這里我們來(lái)講解一下自定義實(shí)現(xiàn)BaseAdapter的普通實(shí)現(xiàn)。
MainActivity.java
public class MainActivity extends AppCompatActivity { //數(shù)據(jù)源 private List<String> data; //ListView控件 private ListView mList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //獲取控件ID mList = (ListView)findViewById(R.id.mList); data = new ArrayList<>(); //數(shù)據(jù)賦初值 for(int i = 0; i < 20; i ++){ data.add("數(shù)據(jù)項(xiàng)"+ i); } //創(chuàng)建適配器 MyAdapter adapter = new MyAdapter(data); //設(shè)置適配器 mList.setAdapter(adapter); } }
MyAdapter.java
public class MyAdapter extends BaseAdapter { //數(shù)據(jù)項(xiàng) private List<String> data; public MyAdapter(List<String> data) { this.data = data; } @Override /** * 返回?cái)?shù)據(jù)源的長(zhǎng)度,表示ListView的item項(xiàng)顯示多少個(gè) */ public int getCount() { return data == null ? 0 : data.size(); } /** * 返回指定位置的 item 數(shù)據(jù)源的對(duì)象,這個(gè)方法為手動(dòng)調(diào)用,非設(shè)置適配器時(shí)候調(diào)用 * @param position 指定位置 * @return */ @Override public Object getItem(int position) { return data.get(position); } /** * 返回指定位置的 item的標(biāo)記 id,很少使用到 * @param position 指定位置 * @return */ @Override public long getItemId(int position) { return position; } /** * 工廠方法,設(shè)置好模板,返回視圖,每個(gè)視圖是怎么顯示出來(lái)的, 核心點(diǎn),怎么產(chǎn)生一個(gè)View, View 里面怎么 * 放置對(duì)應(yīng)的內(nèi)容 * @param position 當(dāng)前加載的位置 * @param convertView 復(fù)用的view * @param parent listview * @return */ @Override public View getView(int position, View convertView, ViewGroup parent) { //獲取布局 View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,null); //獲取布局中的TextView控件1 TextView tv1 = (TextView) view.findViewById(R.id.mTv1); //設(shè)置控件1的數(shù)據(jù) tv1.setText(data.get(position)); //獲取布局中的TextView控件2 TextView tv2 = (TextView) view.findViewById(R.id.mTv2); //設(shè)置控件2數(shù)據(jù) tv2.setText(data.get(position)); return view; } }
以上是普通的使用,但是這樣的效率會(huì)非常低,因?yàn)槊看渭虞d一個(gè)item都會(huì)調(diào)用getView方法,而每次都會(huì)去解析一個(gè)view布局,這樣一直解析會(huì)對(duì)內(nèi)存的消耗特別大,所以效率會(huì)大大降低,那么我們?cè)诖嘶A(chǔ)上先稍微優(yōu)化下,讓view解析次數(shù)變少一點(diǎn),最基本的操作就是采用convertView復(fù)用控件來(lái)進(jìn)行操作。
這里只需要修改getView方法中的處理:
@Override public View getView(int position, View convertView, ViewGroup parent) { Log.i("TAG", "getView: " + position); if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, null); } TextView tv1 = (TextView) convertView.findViewById(R.id.mTv1); tv1.setText(data.get(position)); TextView tv2 = (TextView) convertView.findViewById(R.id.mTv2); tv2.setText(data.get(position)); return convertView; } }
以上的處理方式相比上面的處理方式相對(duì)于上面的解析要少很多次,因?yàn)榈谝环N實(shí)現(xiàn)方式是任何一個(gè)需要顯示的控件都需要去解析一次布局,而這里我們使用了系統(tǒng)給的converView復(fù)用控件,他的基本原理是,系統(tǒng)會(huì)自動(dòng)創(chuàng)建好界面顯示n個(gè)item的數(shù)據(jù)項(xiàng)(比如一個(gè)界面可見的item為5個(gè),默認(rèn)創(chuàng)建好了5個(gè)view布局對(duì)象),保存到converView中(這里可以把他當(dāng)成一個(gè)循環(huán)數(shù)組吧,他的總?cè)萘肯喈?dāng)于是n + 1),當(dāng)顯示第n + 1個(gè)的時(shí)候,他會(huì)解析一次,之后的顯示的view布局會(huì)復(fù)用自己的converView中已經(jīng)存在的布局項(xiàng),而不再去重新解析。簡(jiǎn)單的畫個(gè)圖吧:
如上圖所示,相當(dāng)于只解析了6次,其他的view都是復(fù)用的,所以相對(duì)于上面的實(shí)現(xiàn),這樣的效率會(huì)相對(duì)高一點(diǎn),不過,雖然解析的次數(shù)是少了,但是每個(gè)控件需要findViewById還是會(huì)重復(fù)調(diào)用,而且其實(shí)每個(gè)不同對(duì)象view中的控件id對(duì)象肯定是相同的,所以,重復(fù)的去調(diào)用又會(huì)顯得效率不高,那么如何解決不重復(fù)findViewById呢,那就要使用到我們的優(yōu)化布局了,關(guān)于優(yōu)化,將在下一篇博客中介紹。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Intel HAXM為Android 模擬器加速解決模擬器運(yùn)行慢的問題
Android 模擬器一直以運(yùn)行速度慢著稱, 本文介紹使用 Intel HAXM 技術(shù)為 Android 模擬器加速, 使模擬器運(yùn)行度媲美真機(jī), 徹底解決模擬器運(yùn)行慢的問題,感興趣的朋友可以了解下哦2013-01-01Android實(shí)現(xiàn)底部半透明彈出框PopUpWindow效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)底部半透明彈出框PopUpWindow效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07Android ImageView Src 和Background 區(qū)別
這篇文章主要介紹了Android ImageView Src 和Background 區(qū)別的相關(guān)資料,需要的朋友可以參考下2016-09-09android 網(wǎng)絡(luò)請(qǐng)求庫(kù)volley方法詳解
這篇文章主要介紹了android 網(wǎng)絡(luò)請(qǐng)求庫(kù)volley方法詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09Android 8.0系統(tǒng)中應(yīng)用圖標(biāo)的適配技巧
今天小編就為大家分享一篇關(guān)于Android 8.0系統(tǒng)中應(yīng)用圖標(biāo)的適配技巧,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10Android開發(fā)之Flutter與webview通信橋梁實(shí)現(xiàn)
這篇文章主要為大家介紹了Android開發(fā)之Flutter與webview通信橋梁實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06