ListView是android中比較常用的控件,常用於顯示列表等,對於它的使用應該熟練掌握。
一、ListView的使用
1,在佈局文件中聲明一個ListView控件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="cn.com.cyj.Listview.MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</RelativeLayout>
2,編寫要ListView每一個條目顯示的控件佈局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="名字" />
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="號碼" />
</LinearLayout>
3,在java文件中通過id獲得ListView控件,並給控件設置一個adapter
package cn.com.cyj.Listview;
import java.util.List;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
private ListView listView;
String[] name = new String[] { "張三", "李四", "王五", "趙六", "陳七"};
String[] number = new int[] {"1234567890","987654312","6548415134","654897132"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.lv);
// 給listview添加適配器,用於把集合中的數據顯示到listview
listView.setAdapter(new MyAdapter());
}
// 接口的默認實現類simpleXXX,BaseXXX,defaultXXX
private class MyAdapter extends BaseAdapter {
// 獲得條目數
@Override
public int getCount() {
return personList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return number[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
// 因爲返回view對象,通過資源ID,把指定的佈局文件填充成view對象
v = View.inflate(MainActivity.this, R.layout.listview_item,null);
// findViewById(id)默認在activity_xml中查找,在其前面加view對象引用即在指定的xml文件中查找
TextView tv_name = (TextView) v.findViewById(R.id.tv_name);
TextView tv_number = (TextView) v.findViewById(R.id.tv_number);
tv_name.setText(name[position]);
tv_number.setText(number[position]);
return v;
}
}
}
這樣ListView就可以使用了。
二、ListView的優化
在使用ListView時,由於加載的條目過多在滑動時會造成卡頓,因爲ListView在當前屏幕顯示多少個條目就會創建多少個對象,每一個條目都是一個對象,在滑動時,滑出屏幕的對象被銷燬,新加載到屏幕上的條目會創建新的對象;這樣,在ListView快速滑動時會不斷的創建對象->銷燬對象->創建對象,並且每一個條目都會加載一次佈局,通過findViewById()操作初始化控件,xml文件以樹形結構進行加載,每一次加載都從根節點進行初始化,對內存消耗很大,浪費時間。如果條目有圖片,圖片加載時間比較長,會造成內存溢出。因此,需要對ListView進行優化,優化的原理是在滑動時不會重複創建對象,減少內存消耗和屏幕渲染處理。優化步驟如下:
1,創建靜態類
將需要加載的控件變量放在該靜態類中,保證所有控件只創建一次對象。
static class ViewHolder{
<span style="white-space:pre"> </span>TextView tv_name;
<span style="white-space:pre"> </span>TextView tv_number;
}
2,複用convertView對象
在Adapter的getView()方法中,第二個參數convertView就是之前滑出屏幕的條目對象。如果第一次加載該方法,會創建行的View對象,如果滑動ListView,滑動出屏幕的View對象會以緩存的形式存在,convertView就是緩存的View對象,可以通過複用該緩存對象減少對象的創建。在加載佈局時先判斷convertView對象是否存在,如果convertView == null說明沒有緩存對象,使用View.inflate()方法加載佈局,進行佈局初始化;否則複用緩存的View對象。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = View.inflate(ContactsActivity.this,R.layout.item_contacts, null);
holder = new ViewHolder();
holder.tv_ame = (TextView) convertView.findViewById(R.id.tv_name);
holder.tv_number = (TextView) convertView.findViewById(R.id.tv_number);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv_name.setText(name[position]);
holder.tv_number.setText(<span style="font-family: Arial, Helvetica, sans-serif;">number[position]</span>);
return convertView;
}
這樣就完成了ListView的優化。