代码改变世界

ListView基本用法

2010-12-13 15:10  RayLee  阅读(848)  评论(0编辑  收藏  举报

Android平台定义了ListView控件来显示一系列相关的数据项。对ListView而言,最重要的两方面:数据和显示样式。数据定义了该控件要显示的内容;显示样式定义了如何显示这些数据(文本或图片以及如何排列)。下面将介绍ListView的一些基本使用方法。

运行前,数据集合已知

ListAdapter类封装了数据本身与数据显示的一些实现细节,为开发者定义了一个更加抽象的方式。以最简单的ArrayAdapter<T>,给出一个例子说明。

UI定义:要使用ListView,xml文件中ListView的定义是必不可少的。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

	<Button android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:text="Add item"
			android:id="@+id/btnAdd" />
			
	<ListView android:layout_width="fill_parent"
			android:layout_height="fill_parent"
			android:id="@+id/list" />
</LinearLayout>

 

第一步自然是要索引到ListView控件。

final ListView list = (ListView)findViewById(R.id.list);

 

如果已知要显示的数据集合是String[] items = {“One”, “Tow”, “Three”},通过构建一个包含该集合的ArrayAdapter并将其设置给ListView,一切就完成了。

public class MainActivity extends Activity {

	String[] items = {"One", "Two", "Three"};
	ArrayAdapter adapter;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		final ListView list = (ListView)findViewById(R.id.list);
		adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
		list.setAdapter(adapter);
	}
}

device

运行时,数据动态更新

大多数情况下,在运行时才知道要显示的数据集合。这就要用到ArrayAdapter的接口对数据动态操作了。

public class MainActivity extends Activity {

	int count = 0;
	ArrayAdapter adapter;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		final ListView list = (ListView)findViewById(R.id.list);
		adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);
		list.setAdapter(adapter);
		
		final Button btnAdd = (Button)findViewById(R.id.btnAdd);
		btnAdd.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				count++;
				adapter.add("item" + count);
			}
		});
	}
}

device

当然,也可以显示的传入一个List<T>对象给ArrayAdapter。

public class MainActivity extends Activity {

	int count = 0;
	ArrayAdapter adapter;
	ArrayList<String> items = new ArrayList<String>();

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		final ListView list = (ListView)findViewById(R.id.list);
		adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
		list.setAdapter(adapter);
		
		final Button btnAdd = (Button)findViewById(R.id.btnAdd);
		btnAdd.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				count++;
				adapter.add("item" + count);
			}
		});
	}
}

这种情况下,adapter.add()和items.add()操作的是同一个List<T>对象,不同的是adapter.add()完成后会自动更新UI,items.add()之后还要显示的调用adapter.notifyDataSetChanged()来更新UI。

ListActivity

另外,还可以直接继承ListActivity。但要求定义UI的xml文件必须包含一个id为android:id=”@android:id/list”的ListView控件。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

	<Button android:layout_width="wrap_content"
			android:layout_height="wrap_content"
			android:text="Add item"
			android:id="@+id/btnAdd" />
			
	<ListView android:layout_width="fill_parent"
			android:layout_height="fill_parent"
			android:id="@android:id/list" />
</LinearLayout>

 

public class MainActivity extends ListActivity {

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}
}