天天看點

ListView的簡單使用和性能優化

轉載請注明出處:http://blog.csdn.net/u012572172/article/details/41256519

起源:ListView是Android開發中使用最廣泛的一種控件,它以垂直清單的形式顯示所有清單項。

       建立ListView有兩種方式:

       ☆ 直接使用ListView進行建立。

       ☆讓Activity繼承ListActivity。

       一旦在程式中獲得了ListView之後,接下來就需要為ListView設定它要顯示的清單子項,借助Adapter來實作。

                                                                               ListView常用XML屬性

ListView的簡單使用和性能優化

      下面通過一個簡單的例子來展示ListView的基本使用方法,效果圖見文章結尾。

一、XML Code

      1.activiyt_main.xml

      在主xml檔案内隻添加一個ListView控件。

代碼如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>

</LinearLayout>
           

      2.item.xml

      在這個xml内設定每個子列的布局樣式,此處簡單添加一個ImageView和TextView,分别用來顯示汽車Logo和品牌。

代碼如下:

<?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="horizontal" 
    android:padding="5dp"
    android:background="#FFFFFF">
    
    <ImageView 
        android:id="@+id/car_logo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView 
        android:id="@+id/car_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="10dp"/>

</LinearLayout>
           

二、Java Code

      首先從網上下了一組汽車Logo作為素材。

      接着定義一個實體類,作為ListView擴充卡的适配類型。

      1.Car.java

      Car類隻有兩個屬性:品牌名字和LogoId,以及getName()和getLogoId兩個方法。

代碼如下:

package com.michael.listviewtest;

public class Car {
	
	private String name;
	
	private int logoId;
	
	public Car(String name, int logoId) {
		this.name = name;
		this.logoId = logoId;
	}
	
	public String getName() {
		return name;
	}
	
	public int getLogoId() {
		return logoId;
	}

}
           

       前文已經講過,若想展現ListView内的子項,需要建立一個自定義的擴充卡。此處将自定義的擴充卡繼承自ArrayAdapter,并将泛型指定為Car類。

       2.CarAdapter.java

       重點重寫getView()方法,這個方法在每個子項被滾動到螢幕内時都會被調用。首先通過getItem()方法得到目前子項的Car執行個體。為了提高性能,對ListVie進行适當優化。在CarAdapter類增加一個内部類ViewHolder,用于對控件的執行個體進行緩存。當convertView為空的時候,首先使用LayoutInflater的inflater()方法為子項加載傳入的布局,再建立一個ViewHolder對象,并将控件的執行個體都存放在ViewHolder裡,然後調用ViewHolder的setTag()方法,将ViewHolder對象存儲在View中。當convertView不為空時則調用View的getTag()方法,把ViewHolder重新取出。這樣的話,所有的控件執行個體都緩存在ViewHolder裡,省去了每次通過findVoewById()方法來擷取控件執行個體的步驟,提高了ListView的運作效率。

代碼如下:

package com.michael.listviewtest;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class CarAdapter extends ArrayAdapter<Car>{
	
	private int resourceId;

	public CarAdapter(Context context, int resource, List<Car> objects) {
		super(context, resource, objects);
		resourceId = resource;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		Car car = getItem(position);
		View view;
		ViewHolder viewHolder;
		if(convertView == null) {
			view = LayoutInflater.from(getContext()).inflate(resourceId, null);
			viewHolder = new ViewHolder();
			viewHolder.carLogo = (ImageView)view.findViewById(R.id.car_logo);
			viewHolder.carName = (TextView)view.findViewById(R.id.car_name);
			view.setTag(viewHolder);
		}else {
			view = convertView;
			viewHolder = (ViewHolder)view.getTag();
		}
		viewHolder.carLogo.setImageResource(car.getLogoId());
		viewHolder.carName.setText(car.getName());
		return view;
	}
	
	class ViewHolder {
		ImageView carLogo;
		TextView carName;
	}
}   
           

      3.MainActivity.java

      最後把視圖的加載,資料的初始化以及ListView和Adapter的适配操作添加到MainActivity裡。

      此外為ListView的每個子項添加一個點選事件,通過setOnItemClickListener()方法,并重寫onItemClick()方法,此處就通過Toast子項包含執行個體的名字簡單實作。

代碼如下:

package com.michael.listviewtest;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private List<Car> carLists = new ArrayList<Car>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initCars();
		CarAdapter adapter = new CarAdapter(MainActivity.this, R.layout.item, carLists);
		ListView listView = (ListView)findViewById(R.id.list_view);
		listView.setAdapter(adapter);
		listView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position,
					long id) {
				Car car = carLists.get(position);
				Toast.makeText(MainActivity.this, car.getName(), Toast.LENGTH_SHORT).show();
			}
		});
	}
	
	public void initCars() {
		Car lotus = new Car("Lotus", R.drawable.lotus);
		carLists.add(lotus);
		Car lamboghini = new Car("Lamboghini", R.drawable.lamboghini);
		carLists.add(lamboghini);
		Car bmw = new Car("BMW", R.drawable.bmw);
		carLists.add(bmw);
		Car fiat = new Car("Fiat", R.drawable.fiat);
		carLists.add(fiat);      
		Car cadillac = new Car("Cadillac", R.drawable.cadillac);
		carLists.add(cadillac);
		Car mercedes = new Car("Mercedes", R.drawable.mercedes);
		carLists.add(mercedes);
		Car skoda = new Car("Skoda", R.drawable.skoda);
		carLists.add(skoda);
		Car volvo = new Car("Volvo", R.drawable.volvo);
		carLists.add(volvo);
		Car nissan = new Car("Nissan", R.drawable.nissan);
		carLists.add(nissan);
		Car ferrari = new Car("Ferrari", R.drawable.ferrari);
		carLists.add(ferrari);
		Car porsche = new Car("Porsche", R.drawable.porsche);
		carLists.add(porsche);
		Car rollsroyce = new Car("Rollsroyce", R.drawable.rollsroyce);
		carLists.add(rollsroyce);
	}
}
           

效果圖如下:

ListView的簡單使用和性能優化