Android自定義實(shí)現(xiàn)BaseAdapter的普通實(shí)現(xiàn)
對于ListVie來說,數(shù)據(jù)項(xiàng)的設(shè)置有很多種方式,而自定義實(shí)現(xiàn)BaseAdapter是最經(jīng)常用的了,那么這里我們來講解一下自定義實(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ù)源的長度,表示ListView的item項(xiàng)顯示多少個(gè)
*/
public int getCount() {
return data == null ? 0 : data.size();
}
/**
* 返回指定位置的 item 數(shù)據(jù)源的對象,這個(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è)視圖是怎么顯示出來的, 核心點(diǎn),怎么產(chǎn)生一個(gè)View, View 里面怎么
* 放置對應(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ì)對內(nèi)存的消耗特別大,所以效率會(huì)大大降低,那么我們在此基礎(chǔ)上先稍微優(yōu)化下,讓view解析次數(shù)變少一點(diǎn),最基本的操作就是采用convertView復(fù)用控件來進(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;
}
}
以上的處理方式相比上面的處理方式相對于上面的解析要少很多次,因?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布局對象),保存到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),而不再去重新解析。簡單的畫個(gè)圖吧:

如上圖所示,相當(dāng)于只解析了6次,其他的view都是復(fù)用的,所以相對于上面的實(shí)現(xiàn),這樣的效率會(huì)相對高一點(diǎn),不過,雖然解析的次數(shù)是少了,但是每個(gè)控件需要findViewById還是會(huì)重復(fù)調(diào)用,而且其實(shí)每個(gè)不同對象view中的控件id對象肯定是相同的,所以,重復(fù)的去調(diào)用又會(huì)顯得效率不高,那么如何解決不重復(fù)findViewById呢,那就要使用到我們的優(yōu)化布局了,關(guān)于優(yōu)化,將在下一篇博客中介紹。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Intel HAXM為Android 模擬器加速解決模擬器運(yùn)行慢的問題
Android 模擬器一直以運(yùn)行速度慢著稱, 本文介紹使用 Intel HAXM 技術(shù)為 Android 模擬器加速, 使模擬器運(yùn)行度媲美真機(jī), 徹底解決模擬器運(yùn)行慢的問題,感興趣的朋友可以了解下哦2013-01-01
Android實(shí)現(xiàn)底部半透明彈出框PopUpWindow效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)底部半透明彈出框PopUpWindow效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Android ImageView Src 和Background 區(qū)別
這篇文章主要介紹了Android ImageView Src 和Background 區(qū)別的相關(guān)資料,需要的朋友可以參考下2016-09-09
android 網(wǎng)絡(luò)請求庫volley方法詳解
這篇文章主要介紹了android 網(wǎng)絡(luò)請求庫volley方法詳解的相關(guān)資料,需要的朋友可以參考下2016-09-09
Android 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à)值,需要的朋友一起跟隨小編來看看吧2018-10-10
Android開發(fā)之Flutter與webview通信橋梁實(shí)現(xiàn)
這篇文章主要為大家介紹了Android開發(fā)之Flutter與webview通信橋梁實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

