Android适配器接口及实现类

1 Adapter

1.1 继承示意图

Android适配器接口及实现类_第1张图片

1.2 Adapter常用实现类

ArrayAdapter:简单、易用,通常用于将数组或List集合的多个值包装成多个列表项
SimpleAdapter:并不简单、功能强大,可用于将List集合的多个对象包装成多个列表项
SimpleCursorAdapter:与SimpleAdapter基本相似,只适用于包装Cursor提供的数据
BaseAdapter:常用于被扩展。

2 Arraydapter

2.1 简介

先看一下创建ArrayAdapter对象时必须指定的三个参数

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
    android.R.layout.simple_dropdown_item_1line, list);

参数一:Context:代表访问整个Android应用的接口
参数二:textViewResourceld:一个资源ID,该ID代表一个TextView
参数三:数组或List,负责为多个列表项提供数据

ArrayAdapter很简单,首先创建数组或List即为ListView添加内容,之后创建ArrayAdapter对象,需要指明三个参数,上述已给出具体说明。最后调用ListView的setAdapter()方法即可。

2.2 实例
public class MainActivity extends Activity {
 ListView view;
 ArrayList<String> list = new ArrayList<String>();
 ArrayAdapter<String> adapter = null;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  	super.onCreate(savedInstanceState);
  	setContentView(R.layout.activity_main);
  	view = (ListView)findViewById(R.id.listView1);
  	//
  	for(int i = 0; i < 10; i++) {
   		list.add(i + "");
  	}
  	adapter = new ArrayAdapter<String>(this, 
    		android.R.layout.simple_dropdown_item_1line, list);
  	view.setAdapter(adapter);
  	view.setOnItemClickListener(new OnItemClickListener() {
   	@Override
   	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    		Toast.makeText(MainActivity.this, arg2 + "", Toast.LENGTH_LONG).show();
   	}
  	});
  	view.setOnItemLongClickListener(new OnItemLongClickListener() {
   	@Override
   	public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
   		list.remove(arg2);
    		adapter.notifyDataSetChanged();
    		return true;
   	}
  });
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }
}

xml文件只包含一个ListView组件,这里不再给出。
实例包含为ListView添加列表项,单击显示列表项下标,长摁删除列表项功能。
删除列表项需要调用notifyDataSetChanged(),否则会报错。

3 SimpleAdapter

3.1 简介

SimpleAdapter可以提供更复杂的列表项,包括图片、TextView等。(ArrayAdapter只能是TextView)
SimpleAdapter参数
使用SimpleAdapter最大的难点在于创建SimpleAdapter对象,其需要5个参数。
参数一:同ArrayAdapter参数一相同
参数二:该参数是一个List对象,不同的是,List<>内需要是一个Map对象或继承了Map的集合对象
参数三:该参数指定一个界面布局的ID。(例如要放置复杂组件,则需要一个布局文件指明组件内容)
参数四:该参数应该对应一个String[]数组,该参数提取上述Map对象的key对应的value来生成列表项
参数五:该参数应该是一个int[]的数组,该参数决定填充哪些组件

3.2 实例

该xml代码对应参数三

<LinearLayout 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"
    android:orientation="horizontal" >
    
    <ImageView 
        android:id="@+id/header"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp"/>
    
    <LinearLayout 
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        
        <TextView 
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:paddingLeft="10dp"/>
        
        <TextView 
            android:id="@+id/desc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="14sp"
            android:paddingLeft="10dp"/>
        
    LinearLayout>
    
LinearLayout>

后台代码

public class MainActivity extends Activity {
 ListView view;
 SimpleAdapter adapter;
 ArrayList<Map<String, Object>> list;
 Map<String, Object> map;
 String[] name = {"高祖", "孝帝", "文帝", "景帝", "武帝", "哀帝"};
 int draw = R.drawable.han;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  	super.onCreate(savedInstanceState);
  	setContentView(R.layout.activity_main);
  	view = (ListView)findViewById(R.id.listView1);
  	list = new ArrayList<Map<String, Object>>();
  	int count = 1;
  	for(int i = 0; i < name.length; i++, count++) {
   		map = new HashMap<String, Object>();
   		map.put("header", draw);
   		map.put("name", name[i]);
   		map.put("desc", "汉帝国第" + count + "位皇帝");
   		list.add(map);
  }
  	adapter = new SimpleAdapter(MainActivity.this,
    		list, R.layout.simple_adapter, new String[] {"header", "name", "desc"}, 
    	new int[] {R.id.header, R.id.name, R.id.desc});
  	view.setAdapter(adapter);
 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }
}

执行结果

Android适配器接口及实现类_第2张图片

3.3 总结

SimpleAdapter复杂的原因在于列表项由TextView变成了容器(容器内可以包含多种组件)。因此可以根据要展现的内容编写后台对应的代码。例如上述实例,需要展现一张图像,两项描述,则后台对应代码需要包括指明图像的id以及两项描述的内容。此外,掌握SimpleAdapter重要的是要理解其对象的每一个参数

你可能感兴趣的:(编程语言,安卓)