ListView的使用和優化

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的優化。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章