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