在android開發(fā)中ListView是非常重要的控件。我自己也還是一個(gè)小白,把自己的學(xué)習(xí)經(jīng)驗(yàn)分享出來,希望可以幫到初學(xué)Android的朋友們。這也是我第一次寫博客,我盡量將結(jié)構(gòu)處理的好一些,也說的易懂一些。如果寫得不好或者有誤,請指正見諒!
站在用戶的角度思考問題,與客戶深入溝通,找到瑞安網(wǎng)站設(shè)計(jì)與瑞安網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國際域名空間、網(wǎng)站空間、企業(yè)郵箱。業(yè)務(wù)覆蓋瑞安地區(qū)。
簡介
ListView特性是批量展示結(jié)構(gòu)一樣或者相似的信息并且可以滑動(dòng)展示。ListView是一個(gè)組合控件,組合控件和普通控件的區(qū)別在于:
普通控件:內(nèi)容和控件是一起的。
組合控件:內(nèi)容跟控件是分開的。
所以使用ListView的時(shí)候要用到適配器,那什么是適配器呢,官方文檔的解釋是控件與數(shù)據(jù)之間的一個(gè)橋梁。如果不好理解,不要糾結(jié),用多了自然就明白了。ListView作為一個(gè)整體的框架,而適配器則決定每一行上的內(nèi)容是什么:
ListView 框架
適配器 內(nèi)容
使用
簡單介紹過ListView之后,我們來說下ListView的使用。
1、在Activity的布局文件中放入Listview,注意listview的高度要是match_parent 或者是固定值,這里不建議使用wrapcontent,因?yàn)檫@樣會(huì)有requestLayout的操作,對性能有損耗。
2、準(zhǔn)備好listview的行布局文件listview_item,作為listview每一行的顯示樣式。
3、準(zhǔn)備listview的適配器,聲明一個(gè)類繼承BaseAdpater,實(shí)現(xiàn)四個(gè)方法:
//這個(gè)方法決定了listview顯示內(nèi)容的行數(shù)
public int getCount()
//決定listview每一行的布局以及內(nèi)容,position代表是listview上面的行號。
public View getView(int position, View convertView, ViewGroup parent)
注意:·listview上的每一行要顯示在界面上都必須調(diào)用getView()
·每一個(gè)已經(jīng)消失在屏幕上的行,重新顯示在界面都必須重新調(diào)用getView()
·如果getCount() 返回的結(jié)果為0的話,是不會(huì)調(diào)用getView()
4、getView()中每一行的布局創(chuàng)建以及內(nèi)容設(shè)置
//獲取行布局對象(通過解析行布局文件)
LayoutInflater inflater = getLayoutInflater();//得到布局轉(zhuǎn)換器
View layout = inflater.inflate(R.layout.list_item, null);
//通過布局對象查找它里面控件的索引 (一定要通過行布局對象查找)很多初學(xué)者在使用ListView的時(shí)候很容易報(bào)空指針錯(cuò)誤,就是這個(gè)原因。
TextView textView =(TextView)layout.findViewById(R.id.tv_list_item);
//通過行號查找容器里面對應(yīng)的內(nèi)容
String string = arrayList.get(position);
//把內(nèi)容設(shè)置到布局對象里面的控件對象上面
textView.setText(string);
//返回行布局對象(而不是里面某個(gè)控件)
return layout;
5、查找Listview控件對象
ListView listView = (ListView) findViewById(R.id.listView1);
6、創(chuàng)建一個(gè)適配器對象
MyAdapter adapter = new MyAdapter();
7、為listview配置適配器(如果沒有配置,listview里面是沒有內(nèi)容的)
listView.setAdapter(adapter)
這里再說明一下,行布局為多個(gè)控件,就是之前創(chuàng)建的listview_item,每一行都是listview_item。還要注意的是每行數(shù)據(jù)都要封裝到同一個(gè)對象當(dāng)中,比如都是將數(shù)據(jù)設(shè)置到listview_item里的textview上,這里再重申一遍,每一個(gè)控件的索引都必須通過行布局對象去查找。(否則就為null,運(yùn)行時(shí)會(huì)報(bào)空指針異常)。
優(yōu)化
講完ListView的使用后,講一下ListView的優(yōu)化。
1、復(fù)用行布局
為什么要優(yōu)化ListView呢,因?yàn)樯厦娴膶懛?,每一次getView()的時(shí)候都創(chuàng)建一個(gè)新的行布局對象,又因?yàn)锳ndroid的垃圾回收機(jī)制是不定時(shí)回收的,當(dāng)數(shù)據(jù)比較多的時(shí)候,你上下滑動(dòng),ListView就不斷的創(chuàng)建對象,輕則會(huì)造成卡頓,重則就內(nèi)存溢出了。其實(shí)我們知道,如果屏幕上可以顯示6行,我們準(zhǔn)備7個(gè)布局對象就可以。如果不明白的童鞋可以想象一下,就像戲臺(tái)上演行軍并不需要那么多人,只要讓前面走出戲臺(tái)的人再從后面接上來就可以了。
復(fù)用行布局:
public View getView(int position, View convertView, ViewGroup parent)
{
View layout = null;
if(convertView == null)
{
LayoutInflater inflater = getLayoutInflater();//得到布局轉(zhuǎn)換器
layout = inflater.inflate(R.layout.list_item, null);
}else
{
layout = convertView;
}
return layout;
}
說明: convertView用來保存已經(jīng)創(chuàng)建并且消失在界面的那個(gè)行布局對象的索引。初始為null,當(dāng)行布局對象消失的時(shí)候才有值
2、減少查找次數(shù)
基于復(fù)用行布局的基礎(chǔ)上,如果每一次getView(),都要再去找行布局上的控件也是很麻煩的,因?yàn)榧热皇菑?fù)用,之前肯定是已經(jīng)找過了。這里的優(yōu)化方法如下:
聲明一個(gè)類,類里面的成員變量即為 行布局里面的 控件類型
a、class ViewHolder
{
//將行布局內(nèi)的控件申明為該類的成員變量
ImageView p_w_picpathView;
TextView title;
TextView subTitle;
}
b、在getVIew中
public View getView(int position, View convertView, ViewGroup parent)
{
View layout = null;
ViewHolder holder = null;
if(convertView == null)
{
holder = new ViewHolder();
LayoutInflater inflater = getLayoutInflater();//得到布局轉(zhuǎn)換器
layout = inflater.inflate(R.layout.list_item, null);
holder.p_w_picpathView = (ImageView) layout.findViewById(R.id.iv_list);
holder.title = (TextView) layout.findViewById(R.id.tv_list_item);
holder.subTitle = (TextView) layout.findViewById(R.id.tv_list_sub);
//標(biāo)簽(口袋)
layout.setTag(holder);
}else
{
layout = convertView;
//如果convertView不為空,得到holder,然后得到行布局內(nèi)控件的引用。
holder = (ViewHolder) layout.getTag();
}
當(dāng)然ListView的優(yōu)化在實(shí)際的項(xiàng)目開發(fā)中在數(shù)據(jù)請求的過程中會(huì)有一些bug,這里以后再說明解決。
數(shù)據(jù)的更新
//通知適配器內(nèi)容發(fā)生改變,更新界面
adapter.notifyDataSetChanged();
lisetview 行點(diǎn)擊事件
1、設(shè)置行點(diǎn)擊事件
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView parent, View view,
int position, long id) {
Log.e("onItemClick", "position:" + position);
}
});
2、長按彈出選項(xiàng)菜單
//為listview注冊上下文菜單
registerForContextMenu(listView);
//長按事件
listView.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView parent, View view,
int position, long id) {
Log.e("onItemLongClick", "position:" + position);
MainActivity.this.position = position;
return false; (返回false的時(shí)候事件還會(huì)向下傳遞,返回true就到此結(jié)束)
}
});
當(dāng)然還需重寫onCreateContextMenu和onContextItemSelected方法。listvew長按彈出選項(xiàng)菜單還有另一種方法:
listView.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {
// @Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
}
});
總結(jié)
好了,ListView就講到這里了,當(dāng)然要做出漂亮的listview還沒那么簡單,這些可能會(huì)在后面的博客中說道,希望這篇博客對大家有所幫助,謝謝!
分享文章:androidListView詳解
瀏覽路徑:http://aaarwkj.com/article10/pjdego.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、網(wǎng)站收錄、商城網(wǎng)站、域名注冊、面包屑導(dǎo)航、定制網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)