Android控件学习笔记之 ListView

在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
 
列表的显示需要三个元素:

1.ListVeiw:用来展示列表的View。

2.适配器:用来把数据映射到ListView上的中介。

3.数据:具体的将被映射的字符串、图片,或者基本组件。
根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter
其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。 SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。
ArrayAdapter参数说明

ArrayAdapter(数组适配器)一般用于显示一行文本信息,所以比较容易。

构造函数

ArrayAdapter(Context context, int textViewResourceId)

ArrayAdapter(Context context, int resource, int textViewResourceId)

ArrayAdapter(Context context, int textViewResourceId, T[] objects)

ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)

ArrayAdapter(Context context, int textViewResourceId, List<T> objects)

ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)
    参数 

    context  运行着的视图的上下文。
    textViewResourceId  一个包含了TextView的布局xml文件的id。
    resource  ListView中Item项的复杂布局xml文件。
    objects  给ArrayAdapter提供数据的数组。

SimpleAdapter参数说明:

public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)

构造函数
    参数
    context   关联SimpleAdapter运行着的视图的上下文。
    data        一个Map的列表。在列表中的每个条目对应列表中的一行,应该包含所有在from中指定的条目
    resource              一个定义列表项目的视图布局的资源唯一标识。布局文件将至少应包含哪些在to中定义了的名称。
    from       一个将被添加到Map上关联每一个项目的列名称的列表
    to    应该在参数from显示列的视图。这些应该全是TextView。在列表中最初的N视图是从参数from中最初的N列获取的值。

SimpleAdapter 可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,如果程序的窗口仅仅为了显示一个列表,则可以直接让Activity继承ListActivity来实现,ListActivity的子类无需调用setContentView()来显示某个页面,而是可以直接传入一个Adapter,ListActivity的子类就呈现出一个列表。

SimpleCursorAdapter

SimpleCurosrAdapter 是一个将 Cursor 中的 columns 与在 XML 文件中定义的 TextViews 或 ImageViews 进行匹配的简易 adapter。你可以指定选择 Cursor 中的哪些 columns、用哪些 views 来显示这些 columns 、以及指定定义这些 views 的 xml 文件。 也就是说,SimpleCursorAdapter 允许绑定一个 Cursor 的 columns 到 ListView 上,并使用自定义的 layout 显示 List中的每个项目。可以使用 SimpleCursorAdapter 作为中间桥梁,将从 sqlite 数据库中查询出来的数据直接显示到 ListView 中。



public SimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to)

构造函数
    参数

  Context context  这个与 SimpleListItemFactory 相关的 ListView 所处运行上下文(context)。也就是这个 ListView 所在的 Activity。

  layout  显示 list item 的 布局文件。这个 layout 文件中至少要包含在 "to" 参数中命名的 views。

  c  数据库的光标( Cursor )。如果 cursor 无效,则该参数可以为 null

  from  指定 column 中的哪些列的数据将绑定(显示)到 UI 中。如果 cursor 无效, 则该参数可为 null。

  to  指定用于显示 "from" 参数指定的数据列表的 views。 这些 views 必须都是 TextViews。 "from" 参数的前 N 个值(valus)和 "to" 参数的前 N 个 views 是一一对应的关系。如果 cursor 无效,则该参数可为 null。

SimpleAdapter列子
Main.java
package cn.test;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class Main extends Activity {
    
private Button btn_viewItemAndText;
    @Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initControl();
        setControlListener();
    }
    
    
/**
     * 初始化控件
     
*/
    
private void initControl(){
        btn_viewItemAndText
=(Button)findViewById(R.id.btn_viewItemAndText);
    }
    
    
/**
     * 增加控件监听
     
*/
    
private void setControlListener(){
        btn_viewItemAndText.setOnClickListener(onClickViewItemAndTextListener);
    }
    
    
/**
     * 图文列表按钮事件
     
*/
    
private View.OnClickListener onClickViewItemAndTextListener = new View.OnClickListener() {
        @Override
        
public void onClick(View v) {
            Log.v(
"OnClick ""btn_viewItemAndText");
            Intent intent 
= new Intent(Main.this, ItemAndTextListView.class);
            startActivity(intent);
        }
    };
}
 

ItemAndTextListView.java

package cn.test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.ListActivity;
import android.os.Bundle;
import android.widget.SimpleAdapter;

public class ItemAndTextListView extends ListActivity {
    @Override
    
public void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);

        SimpleAdapter adapter 
= new SimpleAdapter(this,getData(),R.layout.listitem,
                
new String[]{"ItemTitle","ItemText"},
                
new int[]{R.id.ItemTitle,R.id.ItemText});
        setListAdapter(adapter);
    }

    
private List<Map<String, Object>> getData() {
        List
<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

        Map
<String, Object> map = new HashMap<String, Object>();
        map.put(
"ItemTitle""项目标题1");
        map.put(
"ItemText""项目文字   1");
    
        list.add(map);

        map 
= new HashMap<String, Object>();
        map.put(
"ItemTitle""项目标题2");
        map.put(
"ItemText""项目文字   2");

        list.add(map);

        map 
= new HashMap<String, Object>();
        map.put(
"ItemTitle""项目标题3");
        map.put(
"ItemText""项目文字   3");
        
        list.add(map);
        
        
return list;
    }
}
main.xml
<?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"
    
>
<TextView  
    
android:layout_width="fill_parent" 
    android:layout_height
="wrap_content" 
    android:text
="@string/hello"
    
/>
<Button android:layout_height="wrap_content" android:id="@+id/btn_viewItemAndText" android:text="标题加文字" android:layout_width="match_parent"></Button>

</LinearLayout>
 

listitem.xml

 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
="horizontal" android:layout_width="fill_parent"
    android:layout_height
="fill_parent">
    
<LinearLayout android:orientation="vertical"
        android:layout_width
="wrap_content" 
        android:layout_height
="wrap_content">
       
<TextView   
               
android:layout_height="wrap_content"   
               android:layout_width
="fill_parent"   
               android:id
="@+id/ItemTitle"   
               android:textSize
="20dip">  
       
</TextView>  
       
<TextView   
               
android:layout_height="wrap_content"   
               android:layout_width
="fill_parent"   
               android:id
="@+id/ItemText">  
       
</TextView> 
   
</LinearLayout>
</LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package
="cn.test"
      android:versionCode
="1"
      android:versionName
="1.0">
    
<uses-sdk android:minSdkVersion="8" />

    
<application android:icon="@drawable/icon" android:label="@string/app_name">
        
<activity android:name=".Main"
                  android:label
="@string/app_name">
            
<intent-filter>
                
<action android:name="android.intent.action.MAIN" />
                
<category android:name="android.intent.category.LAUNCHER" />
            
</intent-filter>
        
</activity>
 
          
<activity android:name=".ItemAndTextListView"
                  android:label
="@string/app_name">
            
<intent-filter>
                
<action android:name="android.intent.action.itemAndTextListView" />
                
<category android:name="android.intent.category.DEFAULT" />
            
</intent-filter>
        
</activity>
    
</application>
</manifest>
原文地址:https://www.cnblogs.com/skyblue/p/2158314.html