首先,我们常用的Adapter有四种,分别是BaseAdapter、SimpleAdapter、ArrayAdapter、SimpleCursorAdapter四种。

BaseAdapter:基础数据适配器,它的主要用途是将一组数据传到例如ListView等UI显示组件,继承自接口类Adapter,由于是基础类型,所以自由度高, 可以修改的地方多。

SimpleAdapter:简单适配器,系统自定义了一些方法,可以重写这些方法。

ArrayAdapter:数据和UI一对一,传入数据源和布局文件,完成显示。

SimpleCursorAdapter:指向性适配器,指向数据库,可以方便地把数据库的内容以列表的形式展示出来

下面我们来介绍一下这四种Adapter的用法:

1.ArrayAdapter:

      简单的ArrayAdapter,这样的列表的每一行都只有一行文字。
      // 当然listview 也可以是在layout里写好,然后findViewById()获取出来,这样的话后面就不需setContentView(listview);    
   

      ListView listview = new ListView(this);ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1);adapter.add("string1");adapter.add("haha");adapter.add("heihei");       listview.setAdapter(adapter);setContentView(listview);   2.BaseAdapter:
  1. publicclass MyListViewBase extends Activity {
  2. private ListView lv;
  3. //定义一个动态数组
  4. ArrayList<HashMap<String, Object>>listItem;/** Called when the activity is first created. */
  5. @Override
  6. publicvoid onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9. lv = (ListView) findViewById(R.id.lv);
  10. MyAdapter mAdapter = new MyAdapter(this);//得到一个MyAdapter对象
  11. lv.setAdapter(mAdapter);//为ListView绑定Adapter
  12. /**为ListView添加点击事件*/
  13. lv.setOnItemClickListener(new OnItemClickListener() {
  14. @Override
  15. publicvoid onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
  16. Log.v("MyListViewBase", "你点击了ListView条目" + arg2);//在LogCat中输出信息
  17. }
  18. });
  19. }
  20. /**添加一个得到数据的方法,方便使用*/
  21. private ArrayList<HashMap<String, Object>> getDate(){
  22. ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String,Object>>();
  23. /**为动态数组添加数据*/
  24. for(int i=0;i<30;i++)
  25. {
  26. HashMap<String, Object> map = new HashMap<String, Object>();
  27. map.put("ItemTitle", "第"+i+"行");
  28. map.put("ItemText", "这是第"+i+"行");
  29. listItem.add(map);
  30. }
  31. return listItem;
  32. }
 
  1. /** 新建一个类继承BaseAdapter,实现视图与数据的绑定
  2. */
  3. privateclass MyAdapter extends BaseAdapter {
  4. private LayoutInflater mInflater;//得到一个LayoutInfalter对象用来导入布局
  5. /**构造函数*/
  6. public MyAdapter(Context context) {
  7. this.mInflater = LayoutInflater.from(context);
  8. }
  9. @Override
  10. publicint getCount() {
  11. return getDate().size();//返回数组的长度
  12. }
  13. @Override
  14. public Object getItem(int position) {
  15. returnnull;
  16. }
  17. @Override
  18. publiclong getItemId(int position) {
  19. return 0;
  20. }
  21. /**书中详细解释该方法*/
  22. @Override
  23. public View getView(finalint position, View convertView, ViewGroup parent) {
  24. ViewHolder holder;
  25. //观察convertView随ListView滚动情况
  26. Log.v("MyListViewBase", "getView " + position + " " + convertView);
  27. if (convertView == null) {
  28. convertView = mInflater.inflate(R.layout.item,null);
  29. holder = new ViewHolder();
  30. /**得到各个控件的对象*/
  31. holder.title = (TextView) convertView.findViewById(R.id.ItemTitle);
  32. holder.text = (TextView) convertView.findViewById(R.id.ItemText);
  33. holder.bt = (Button) convertView.findViewById(R.id.ItemButton);
  34. convertView.setTag(holder);//绑定ViewHolder对象
  35. }
  36. else{
  37. holder = (ViewHolder)convertView.getTag();//取出ViewHolder对象
  38. }
  39. /**设置TextView显示的内容,即我们存放在动态数组中的数据*/
  40. holder.title.setText(getDate().get(position).get("ItemTitle").toString());
  41. holder.text.setText(getDate().get(position).get("ItemText").toString());
  42. /**为Button添加点击事件*/
  43. holder.bt.setOnClickListener(new OnClickListener() {
  44. @Override
  45. publicvoid onClick(View v) {
  46. Log.v("MyListViewBase", "你点击了按钮" + position);//打印Button的点击信息
  47. }
  48. });
  49. return convertView;
  50. }
  51. }
  52. /**存放控件*/
  53. publicfinalclass ViewHolder{
  54. public TextView title;
  55. public TextView text;
  56. public Button   bt;
  57. }
  58. }
      还需要注意的是,Button会抢夺ListView的焦点,需要将Button设置为没有焦点。设置非常简单,只需要在xml的Button标签下加入一行:Android:focusable=“false”代码就可以了。在LogCat观察点击后输出的信息,运行效果如图所示:
  3.SimpleAdapter

ListView可以使用最基本的ArrayAdapter填充,但是每一行只能填充文本。我们的聊天内容除了文本,还希望有个头像(当然后期还可以再添聊天时间、用户名之类的~),首相想到的是使用SimpleAdapter。

这是第一个Demo的代码:

  1. public class TryChatPopActivity extends Activity {
  2. ListView itemlist = null;
  3. List<Map<String, Object>> list;
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. itemlist = (ListView) findViewById(R.id.chatlist);
  8. refreshListItems();
  9. }
  10. private void refreshListItems() {
  11. list = buildListForSimpleAdapter();
  12. //实例适配器
  13. SimpleAdapter chat = new SimpleAdapter(this, list, R.layout.chata,
  14. new String[] {"chatportrait","chatinfo"}, new int[] {R.id.imgPortraitA,R.id.txvInfo});
  15. itemlist.setAdapter(chat);
  16. itemlist.setSelection(0);
  17. }
  18. //用来实例化列表容器的函数
  19. private List<Map<String, Object>> buildListForSimpleAdapter() {
  20. List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(2);
  21. ImageView  imgA=(ImageView)findViewById(R.id.imgPortraitA);
  22. //向列表容器中添加数据(每列中包括一个头像和聊天信息)
  23. Map<String, Object> map = new HashMap<String, Object>();
  24. map.put("chatportrait",imgA);
  25. map.put("chatinfo", "嗨~");
  26. list.add(map);
  27. map = new HashMap<String, Object>();
  28. map.put("chatportrait",imgA);
  29. map.put("chatinfo", "嗨~\n你好!");
  30. list.add(map);
  31. map = new HashMap<String, Object>();
  32. map.put("chatportrait",imgA);
  33. map.put("chatinfo", "嗨~\n你好!\n我是小魏~");
  34. list.add(map);
  35. return list;
  36. }
  37. }

其中 chata 布局文件如下:

  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="wrap_content"
  6. android:orientation="horizontal"
  7. android:paddingTop="5px"
  8. >
  9. <ImageView
  10. android:layout_width="42px"
  11. android:layout_height="42px"
  12. android:layout_gravity="bottom"
  13. android:id="@+id/imgPortraitA"
  14. android:background="@drawable/portraita"
  15. />
  16. <TextView android:id="@+id/txvInfo"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:paddingTop="5px"
  20. android:paddingBottom="5px"
  21. android:paddingLeft="5px"
  22. android:textColor="@android:color/black"
  23. android:textSize="18dip"
  24. android:background="@drawable/chatbg"></TextView>
  25. </LinearLayout>

这里最关键是尝试定义和使用SimpleAdapter适配器:

SimpleAdapter chat = new SimpleAdapter(this, list, R.layout.chata,  new String[] {"chatportrait","chatinfo"}, new int[] {R.id.imgPortraitA,R.id.txvInfo});

其中第一个参数是context,即当前的Activity;第二个参数是要去填充ListView每一行内容的list;第三个参数resource是ListView每一行填充的布局文件。

比较麻烦的是第四个和第五个参数,SimpleAdapter构造函数中第四个参数String[] from表示名字数组,因为在ArrayList存放的都是Map<String,Object>的item,from中的名字就是为了索引ArrayList中的Object。

第五个参数在构造函数中表示为int[] to,是索引layout中的id,对应前面每项的布局格式。

4.  SimpleCursorAdapter

1     packagecom.example.simplecursoradapter;

2

3     import android.app.Activity;

4     import android.content.Intent;

5     import android.database.Cursor;

6     import android.database.CursorWrapper;

7     import android.graphics.Color;

8     import android.net.Uri;

9     import android.os.Bundle;

10    importandroid.provider.Contacts.People;

11    importandroid.telephony.PhoneNumberUtils;

12    import android.util.Log;

13    import android.view.View;

14    importandroid.widget.AdapterView;

15    import android.widget.LinearLayout;

16    importandroid.widget.ListAdapter;

17    importandroid.widget.ListView;

18    importandroid.widget.SimpleCursorAdapter;

19

20

21   publicclassMainActivity extendsActivity {

22   privatestatic final StringTAG = "MainActivity";

23   ListViewlistView;

24   ListAdapteradapter;

25

26     @Override

27     publicvoid onCreate(BundlesavedInstanceState) {

28         super.onCreate(savedInstanceState);

29

30         LinearLayout linearLayout =new LinearLayout(this);

31         linearLayout.setOrientation(LinearLayout.VERTICAL);

32

33         LinearLayout.LayoutParams param =newLinearLayout.LayoutParams(

34                 LinearLayout.LayoutParams.FILL_PARENT,

35                 LinearLayout.LayoutParams.WRAP_CONTENT);

36

37         listView = newListView(this);

38         linearLayout.addView(listView, param);

39         this.setContentView(linearLayout);

40

41         // 从数据库获取联系人姓名和电话号码

42         Cursor cur = this.getContentResolver().query(People.CONTENT_URI,null,

43                 null,null, null);

44         adapter = newSimpleCursorAdapter(this,

45                android.R.layout.simple_list_item_2, cur,new String[] {

46                         People.NAME,People.NUMBER },new int[] {

47                         android.R.id.text1,android.R.id.text2 });

48         this.startManagingCursor(cur);

49         listView.setAdapter(adapter);

50

51         listView.setOnItemClickListener(newAdapterView.OnItemClickListener() {

52

53             publicvoid onItemClick(AdapterView<?> arg0, View arg1,

54                     intposition, long arg3){

55

56                 // names=((CursorWrapper)listView.getItemAtPosition(position)).getColumnNames();

57                 // 从指针的封装类中获得选中项的电话号码并拨号

58                 CursorWrapper wrapper = (CursorWrapper) listView

59                         .getItemAtPosition(position);

60                 intcolumnIndex = wrapper.getColumnIndex(People.NUMBER);

61                 if(!wrapper.isNull(columnIndex)) {

62                     String number = wrapper.getString(columnIndex);

63                     Log.d(TAG,"number=" + number);

64                     //判断电话号码的有效性

65                     if (PhoneNumberUtils.isGlobalPhoneNumber(number)) {

66                         Intent intent =new Intent(Intent.ACTION_DIAL,Uri

67                                .parse("tel://" + number));

68                         startActivity(intent);

69                     }

70                 }

71             }

72         });

73     }

74 }

不要忘记添加权限:

<intent-filter>

<actionandroid:name="android.Intent.Action.CALL_BUTTON"/>

<categoryandroid:name="android.Intent.Category.DEFAULT"/>

</intent-filter>

<uses-permissionandroid:name="android.permission.READ_CONTACTS"/>

Adapter的作用及用法相关推荐

  1. PreTranslateMessage作用和用法

    PreTranslateMessage作用和用法 PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗体的消息都要通过这里,比較经常使用,当 ...

  2. java package作用_java import、package作用与用法

    java import.package作用与用法 有些人写了一阵子Java,可是对於Java 的package 跟import 还是不太了解很多人以為原始码 .java 档案中的import 会让编译 ...

  3. MySQL数据类型中DECIMAL的作用和用法

    在MySQL数据类型中,例如INT,FLOAT,DOUBLE,CHAR,DECIMAL等,它们都有各自的作用,下面我们就主要来介绍一下MySQL数据类型中的DECIMAL类型的作用和用法. 一般赋予浮 ...

  4. php中pre标签,html中pre标签与code标签的作用与用法

    HTML 标签 定义和用法 pre 元素可定义预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. 标签的一个常见应用就是用来表示计算机的源代码. 可以导致 ...

  5. PHP中的常见魔术方法功能作用及用法实例

    这篇文章主要介绍了PHP中的常见魔术方法功能作用及用法实例,本文讲解了构造函数和析构函数__construct()和__desctruct()以及属性重载(Property Overloading)_ ...

  6. 、简述global关键字的作用_在C#编程中global关键字的作用及其用法

    在C#编程中,global 是 C# 2.0 中新增的关键字,理论上说,如果代码写得好的话,根本不需要用到它.今天就为大家展示下global关键字的作用及其用法,希望对大家学习C#编程有所帮助. 假设 ...

  7. chrome中Blackbox Script 黑盒脚本作用及用法

    chrome中Blackbox Script 黑盒脚本作用及用法 Blackbox Script功能 每天前端人员在调试代码的时候,都可能会遇到代码调试着会进入第三方库文件,带来很多没必要的调试,不方 ...

  8. C#中using关键字的作用及其用法(转)

    C#中using关键字的作用及其用法 using的用途和使用技巧.     using关键字微软MSDN上解释总共有三种用途:     1.引用命名空间.     2.为命名空间或类型创建别名.    ...

  9. Vue 中的 v-cloak 作用及用法

    v-cloak 的作用和用法 用法: 这个指令保持在元素上直到关联实例结束编译.和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Must ...

最新文章

  1. 更精准地生成字幕!哥大Facebook开发AI新框架,多模态融合,性能更强
  2. 唠唠SE的集合-04——ArrayList
  3. C++Linear search线性搜索的实现算法(附完整源码)
  4. MUI 支付宝支付接入
  5. [转]关于支付宝API开发的一点心得
  6. ubuntu 串口调试工具推荐_串口调试能有多便捷?——FUR组件的应用
  7. Spring Framework 核心原理与源码解析-大纲
  8. UIAlertView使用全解
  9. You need libtool version 1.5.14 or newer to build
  10. 【Windows】操作系统原理
  11. 基于C51控制蜂鸣器
  12. FreeSWITCH(二) - 安装部署、试用
  13. h5打开APP,如果未下载跳转下载页,如果已下载唤醒APP
  14. h5游戏引擎有哪些?h5制作模板游戏的教程和流程是什么?
  15. Package Cache搬家
  16. Mac重装系统-使用Mac笔记本制作U盘启动盘
  17. phpstudy 运行PHP项目
  18. 今天您大数据营销了吗?
  19. JAVA实现K-means聚类
  20. UVa 1586 Molar mass

热门文章

  1. 二狗子的志愿者故事20210121
  2. 50台机器无盘服务器,以50台机器小吧为例看深度无盘快速布署的那些事.doc
  3. 《大长今》分集剧情介绍(上)
  4. 扫描电镜图片的Matlab分析,基于Matlab的图像增强与复原技术在SEM图像中的应
  5. Java猿社区—Http digest authentication 请求代码最全示例
  6. python实现向图像随机添加高斯白噪声,并修改尺寸
  7. H1B政策大变,要集体涨工资了吗?
  8. 以下是三套目前Web 2.0网站流行试用的颜色元素
  9. WiFi_WiFi6和WiFi5区别
  10. 在Ubuntu系统下运行c语言程序