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