在Android开发中,我们要显示一个ListView,通常会定义出一个Adapter,用于将ListView和ListView上的数据连接起来,这里我总结一下平常开发中使用到的几种Adapter。
一、ArrayAdapter
ArrayAdapter是最简单的一种Adapter,显示的ListView也比较简单,一般是字符串,用法如下:
- package cn.yubo.androidadaptertest;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- public class ArrayAdapterActivity extends Activity {
- private ListView listView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.list_layout);
- initView();
- }
- private void initView(){
- listView = (ListView) findViewById(R.id.listView);
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
- android.R.layout.simple_list_item_1,
- new String[]{"zhangsan", "lisi", "wangwu", "qianliu", "zhaoqi"});
- listView.setAdapter(adapter);
- }
- }
这里定义了一个ListView,ArrayAdapter的构造方法参数有三个,第一个参数为上下文对象Context,第二个参数为ListView上每个条目的布局文件,这里使用的是Android内置的布局文件android.R.layout.simple_list_item_1,第三个参数是字符串数组,用于ListView上的数据显示,可以看到ArrayAdapter的用法还是比较简单的,但是这种Adapter比较有局限性,如果要显示的ListView的Item中布局比较复杂,使用ArrayAdapter肯定就不合适了。
二、SimpleAdapter
SimpleAdapter比ArrayAdapter强大一点,可以布局更复杂的listitem,下面是SimpleAdapter一般的用法:
- package cn.yubo.androidadaptertest;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.Activity;
- import android.os.Bundle;
- import android.widget.ListView;
- import android.widget.SimpleAdapter;
- public class SimpleAdapterActivity extends Activity {
- private ListView listView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.list_layout);
- initView();
- }
- private void initView(){
- listView = (ListView) findViewById(R.id.listView);
- SimpleAdapter adapter = new SimpleAdapter(this, getData(),
- R.layout.list_item,
- new String[]{"image", "title"},
- new int[]{R.id.item_img, R.id.item_title});
- listView.setAdapter(adapter);
- }
- private List<Map<String, Object>> getData(){
- List<Map<String, Object >> list = new ArrayList<Map<String, Object>>();
- String[] titles = {"zhangsan", "lisi", "wangwu", "qianliu", "zhaoqi"};
- int[] images = {R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e};
- for(int i = 0; i < titles.length; i++){
- Map<String, Object> map = new HashMap<String, Object>();
- map.put("title", titles[i]);
- map.put("image", images[i]);
- list.add(map);
- }
- return list;
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:padding="10dp"
- >
- <ImageView
- android:id="@+id/item_img"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:src="@drawable/ic_launcher"
- />
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/item_title"
- android:layout_marginLeft="10dp"
- android:text="title"
- />
- </LinearLayout>
- </LinearLayout>
三、BaseAdapter
BaseAdapter是一个抽象类,我们要使用BaseAdapter,必须自己写一个类继承BaseAdapter,然后复写BaseAdapter中的几个方法,先看BaseAdapter的用法,如下面的代码:
- package cn.yubo.androidadaptertest;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.BaseAdapter;
- import android.widget.ImageView;
- import android.widget.ListView;
- import android.widget.TextView;
- public class BaseAdapterActivity extends Activity {
- private ListView listView;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.list_layout);
- initView();
- }
- private void initView(){
- listView = (ListView) findViewById(R.id.listView);
- ListViewAdapter adapter = new ListViewAdapter();
- listView.setAdapter(adapter);
- }
- class ListViewAdapter extends BaseAdapter{
- private String[] titles = {"zhangsan", "lisi", "wangwu", "qianliu", "zhaoqi"};
- private int[] images = {R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e};
- //返回ListView中的item个数
- public int getCount() {
- return titles.length;
- }
- public Object getItem(int position) {
- return null;
- }
- public long getItemId(int position) {
- return position;
- }
- //这是最主要的一个方法,返回的是item布局
- public View getView(int position, View convertView, ViewGroup parent) {
- if(convertView == null){
- convertView = LayoutInflater.from(BaseAdapterActivity.this).inflate(R.layout.list_item, null);
- ((ImageView)convertView.findViewById(R.id.item_img)).setImageResource(images[position]);
- ((TextView)convertView.findViewById(R.id.item_title)).setText(titles[position]);
- }
- return convertView;
- }
- }
- }
四、SimpleCursorAdapter
SimpleCursorAdapter是一种用于显示数据库数据的Adapter,它的构造方法中通过传入一个Cursor对象,就可以很容易的显示数据库中的数据,先看代码:
- package cn.yubo.androidadaptertest;
- import android.app.Activity;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- import android.os.Bundle;
- import android.support.v4.widget.SimpleCursorAdapter;
- import android.widget.ListView;
- import cn.yubo.androidadaptertest.db.MyDBHelper;
- public class SimpleCursorAdapterActivity extends Activity {
- private ListView listView;
- private MyDBHelper helper;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.list_layout);
- helper = new MyDBHelper(this, "test.db3", null, 1);
- initView();
- }
- private void initView(){
- listView = (ListView) findViewById(R.id.listView);
- SQLiteDatabase db = helper.getReadableDatabase();
- Cursor c = db.rawQuery("select _id, name from person", null);
- SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
- R.layout.list_item, c, new String[]{"name"},
- new int[]{R.id.item_title}, 0);
- listView.setAdapter(adapter);
- }
- }
- package cn.yubo.androidadaptertest.db;
- import android.content.Context;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteDatabase.CursorFactory;
- import android.database.sqlite.SQLiteOpenHelper;
- public class MyDBHelper extends SQLiteOpenHelper {
- public MyDBHelper(Context context, String name, CursorFactory factory,
- int version) {
- super(context, name, factory, version);
- }
- @Override
- public void onCreate(SQLiteDatabase db) {
- db.execSQL("create table person (_id integer, name text)");
- String[] names = {"zhangsan", "lisi", "wangwu", "qianliu", "zhaoqi"};
- for(int i = 0; i < names.length; i++){
- db.execSQL("insert into person(name) values(?)", new Object[]{names[i]});
- }
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- }
- }