Android自定義實現(xiàn)BaseAdapter的普通實現(xiàn)
對于ListVie來說,數(shù)據(jù)項的設置有很多種方式,而自定義實現(xiàn)BaseAdapter是最經(jīng)常用的了,那么這里我們來講解一下自定義實現(xiàn)BaseAdapter的普通實現(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ù)項"+ i);
}
//創(chuàng)建適配器
MyAdapter adapter = new MyAdapter(data);
//設置適配器
mList.setAdapter(adapter);
}
}
MyAdapter.java
public class MyAdapter extends BaseAdapter {
//數(shù)據(jù)項
private List<String> data;
public MyAdapter(List<String> data) {
this.data = data;
}
@Override
/**
* 返回數(shù)據(jù)源的長度,表示ListView的item項顯示多少個
*/
public int getCount() {
return data == null ? 0 : data.size();
}
/**
* 返回指定位置的 item 數(shù)據(jù)源的對象,這個方法為手動調(diào)用,非設置適配器時候調(diào)用
* @param position 指定位置
* @return
*/
@Override
public Object getItem(int position) {
return data.get(position);
}
/**
* 返回指定位置的 item的標記 id,很少使用到
* @param position 指定位置
* @return
*/
@Override
public long getItemId(int position) {
return position;
}
/**
* 工廠方法,設置好模板,返回視圖,每個視圖是怎么顯示出來的, 核心點,怎么產(chǎn)生一個View, View 里面怎么
* 放置對應的內(nèi)容
* @param position 當前加載的位置
* @param convertView 復用的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);
//設置控件1的數(shù)據(jù)
tv1.setText(data.get(position));
//獲取布局中的TextView控件2
TextView tv2 = (TextView) view.findViewById(R.id.mTv2);
//設置控件2數(shù)據(jù)
tv2.setText(data.get(position));
return view;
}
}
以上是普通的使用,但是這樣的效率會非常低,因為每次加載一個item都會調(diào)用getView方法,而每次都會去解析一個view布局,這樣一直解析會對內(nèi)存的消耗特別大,所以效率會大大降低,那么我們在此基礎上先稍微優(yōu)化下,讓view解析次數(shù)變少一點,最基本的操作就是采用convertView復用控件來進行操作。
這里只需要修改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;
}
}
以上的處理方式相比上面的處理方式相對于上面的解析要少很多次,因為第一種實現(xiàn)方式是任何一個需要顯示的控件都需要去解析一次布局,而這里我們使用了系統(tǒng)給的converView復用控件,他的基本原理是,系統(tǒng)會自動創(chuàng)建好界面顯示n個item的數(shù)據(jù)項(比如一個界面可見的item為5個,默認創(chuàng)建好了5個view布局對象),保存到converView中(這里可以把他當成一個循環(huán)數(shù)組吧,他的總?cè)萘肯喈斢谑莕 + 1),當顯示第n + 1個的時候,他會解析一次,之后的顯示的view布局會復用自己的converView中已經(jīng)存在的布局項,而不再去重新解析。簡單的畫個圖吧:

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

