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);
}
}
运行时,数据动态更新
大多数情况下,在运行时才知道要显示的数据集合。这就要用到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);
}
});
}
}
当然,也可以显示的传入一个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);
}
}