Android之ListView(一)(网上流行好多版本,我相信这个是最独特的)

来源:转载

     首先说明,Android的ListView可以使用系统预定义的效果,也可以自己定义。我们将这两个分别进行讲解。

     1.自定义:

     我们先看一下自定义的,然后和系统预定义的对比一下,看看Android为我们提供了哪些便利。

     这篇文章主要解决了以下几个问题:

1.数据显示在哪里? 2.数据怎么显示? 3.显示什么数据?

     首先我们需要在layout文件中定义一个ListView,代码如下:

main.xml:

 1: <?xml version="1.0" encoding="utf-8"?>
 2: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3: android:orientation="vertical"
 4: android:layout_width="fill_parent"
 5: android:layout_height="fill_parent"
 6: >
 7: <ListView
 8: android:id="@+id/list_view"
 9: android:layout_width="fill_parent"
 10: android:layout_height="fill_parent"
 11: />
 12: </LinearLayout>

     这样我们解决了第一个问题------数据显示在main.xml的布局里

     然后我们可以在需要显示ListView的Activity中得到该ListView的引用:

ListViewTest.java

 1: public class ListViewTest extends Activity 
 2: {
 3: private ListView listView;
 4: /** Called when the activity is first created. */
 5: @Override
 6: public void onCreate(Bundle savedInstanceState) 
 7: {
 8: super.onCreate(savedInstanceState);
 9: setContentView(R.layout.main);
 10: 
 11: this.listView = (ListView)findViewById(R.id.list_view);
 12: }
 13: }

     接下来我们就可以操作listView对象了。

     首先我们需要明确一个概念,就是:ListView中单个项的布局,

     注:该两幅图片引自http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html

     我们可以看一下这两幅图片中每一项的特点,其中图1的每一项只有一行文字,也就是只有一个TextView,图2的每一项有一幅图片和两行文字,在这里我可以告诉大家,ListView中的项的布局也对应一个Layout文件。也就是说,如果我们自定义ListView的话,至少需要两个Layout,一个是程序的整体布局,另一个是ListView中项的布局。

     我们可以试着写一下图1中项的布局:

     在这里我在Layout目录下新建了一个vlist.xml文件代表项的布局,main.xml代表整体布局

vlist.xml:

 1: <?xml version="1.0" encoding="utf-8"?>
 2: <LinearLayout
 3: xmlns:android="http://schemas.android.com/apk/res/android"
 4: android:layout_width="fill_parent"
 5: android:layout_height="fill_parent">
 6: <TextView
 7: android:id="@+id/text"
 8: android:layout_width="fill_parent"
 9: android:layout_height="wrap_content"
 10: />
 11: </LinearLayout>
     我们需要注意其中TextView的id,由于在后边我们需要对这个TextView进行操作(设置TextView的Text),所以需要指配给它一个id。这样我们解决了第二个问题------数据根据项布局进行显示。     OK,接下来我们就考虑下一个问题,显示什么数据?     这时候我们需要引入一个Adapter(适配器)的概念,通俗地来讲,Adapter就是将数据映射到ListView的中介,也就是说,我们需要通过设置Adapter来设置所谓的数据源。     Android为我们提供了三种类型的适配器:ArrayAdapter,SimpleAdapter和SimpleCursorAdapter。其中SimpleAdapter扩展性最好,由于在这篇文章中我们是自定义ListView的格式,所以我们选择SimpleAdapter,我们首先看一下SDK文档中对SimpleAdapter构造函数的描述:
public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)

Since: API Level 1

Constructor

Parameters

context

The context where the View associated with this SimpleAdapter is running

data

A List of Maps. Each entry in the List corresponds to one row in the list. The Maps contain the data for each row, and should include all the entries specified in "from"

resource

Resource identifier of a view layout that defines the views for this list item. The layout file should include at least those named views defined in "to"

from

A list of column names that will be added to the Map associated with each item.

to The views that should display column in the "from" parameter. These should all be TextViews. The first N views in this list are given the values of the first N columns in the from parameter.

     OK,我们看一下传的这几个参数,Context:这个没什么问题,直接传递Activity的Context;Data:是一个Map的List,也就是说我们需要有一个类型为List<Map<?>>的对象来表示数据;Resource:就是刚才提到的项布局啦!剩下的from和to我们稍等看实例说。     我们直接看一个实例:
 1: public class ListViewTest extends Activity 
 2: {
 3: private ListView listView;
 4: /** Called when the activity is first created. */
 5: @Override
 6: public void onCreate(Bundle savedInstanceState) 
 7: {
 8: super.onCreate(savedInstanceState);
 9: setContentView(R.layout.main);
 10: 
 11: this.listView = (ListView)findViewById(R.id.list_view);
 12: 
 13: List<Map<String, Object>> data = this.getData();
 14: 
 15: SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.vlist,
 16: new String[] {"text"},
 17: new int[] {R.id.text}
 18: );
 19: 
 20: this.listView.setAdapter(adapter);
 21: 
 22: }
 23: 
 24: private List<Map<String, Object>> getData()
 25: {
 26: List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
 27: 
 28: for(int n=0; n<30; n++)
 29: {
 30: Map<String, Object> map = new HashMap<String, Object>();
 31: map.put("text", "" + n);
 32: data.add(map);
 33: }
 34: return data;
 35: }
 36: }

     Ok,我们首先看一下getData的这个函数,这个函数是为了返回一个List<Map<String, Object>>类型的对象,该对象作为data传入SimpleAdapter的构造函数中。然后让我们看最后两个参数,这两个参数是对应的,其中的String数组标识了map对应的键,int数组标志了项布局中的id,也就是说:该构造函数将map中键为“text”的值显示在项布局中id为R.id.text的TextView上。

     好,有关自定义的ListView我们掌握的差不多了,我们可以将其中的项布局做地复杂一点来将ListView做复杂。

     下篇预告:一个复杂一点的自定义ListView的示例。

     最后还是那句被大家写烂了的话:转载请注明出处,并保持文章完整性,谢谢!E-mail:[email protected]


分享给朋友:
您可能感兴趣的文章:
随机阅读: