我的编程空间,编程开发者的网络收藏夹
学习永远不晚

浅析Android之Adapter用法总结

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

浅析Android之Adapter用法总结

1.概念

 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、View三者的关系:
Android中所有的Adapter一览:
 由图可以看到在Android中与Adapter有关的所有接口、类的完整层级图。在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展。比较常用的有 BaseAdapter,SimpleAdapter,ArrayAdapter,SimpleCursorAdapter等。

BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性; ArrayAdapter支持泛型操作,最为简单,只能展示一行字。 SimpleAdapter有最好的扩充性,可以自定义出各种效果。 SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。

2.应用案例

1)ArrayAdapter

列表的显示需要三个元素:

a.ListVeiw 用来展示列表的View。

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

c.数据    具体的将被映射的字符串,图片,或者基本组件。

案例一


public class ArrayAdapterActivity extends ListActivity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   //列表项的数据
   String[] strs = {"1","2","3","4","5"};
   ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,strs);
   setListAdapter(adapter);
  }
 }

 案例二


 public class MyListView extends Activity {
  private ListView listView;
  //private List<String> data = new ArrayList<String>();
  @Override
  public void onCreate(Bundle savedInstanceState){
   super.onCreate(savedInstanceState);
   listView = new ListView(this);
   listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));
   setContentView(listView);
  }
  private List<String> getData(){
   List<String> data = new ArrayList<String>();
   data.add("测试数据1");
   data.add("测试数据2");
   data.add("测试数据3");
   data.add("测试数据4");
   return data;
  }
 }

上面代码使用了ArrayAdapter(Context context, int textViewResourceId, List<T> objects)来装配数据,要装配这些数据就需要一个连接ListView视图对象和数组数据的适配器来两者的适配工作,ArrayAdapter的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。同时用setAdapter()完成适配的最后工作。效果图如下:

2)SimpleAdapter

simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。

案例一

simple.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"
>
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
/>
<TextView
android:id="@+id/title"
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:textColor="#ffffff"
android:textSize="20sp"
/>
</LinearLayout>

public class SimpleAdapterActivity extends ListActivity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.simple, new String[] { "title", "img" }, new int[] { R.id.title, R.id.img });
   setListAdapter(adapter);
  }
  private List<Map<String, Object>> getData() {
   //map.put(参数名字,参数值)
   List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
   Map<String, Object> map = new HashMap<String, Object>();
   map.put("title", "摩托罗拉");
   map.put("img", R.drawable.icon);
   list.add(map);
   map = new HashMap<String, Object>();
   map.put("title", "诺基亚");
   map.put("img", R.drawable.icon);
   list.add(map);
   map = new HashMap<String, Object>();
   map.put("title", "三星");
   map.put("img", R.drawable.icon);
   list.add(map);
   return list;
   } 
 }

 案例二

下面的程序是实现一个带有图片的类表。首先需要定义好一个用来显示每一个列内容的xml,vlist.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"> 
  <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5px"/>
  <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content">
   <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:textColor="#FFFFFFFF" android:textSize="22px" />
   <TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:textColor="#FFFFFFFF" android:textSize="13px" />
  </LinearLayout>
  </LinearLayout>

 public class MyListView3 extends ListActivity {
  // private List<String> data = new ArrayList<String>();
  @Override
  public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.vlist,
     new String[]{"title","info","img"},
     new int[]{R.id.title,R.id.info,R.id.img});
   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("title", "G1");
   map.put("info", "google 1");
   map.put("img", R.drawable.i1);
   list.add(map);
   map = new HashMap<String, Object>();
   map.put("title", "G2");
   map.put("info", "google 2");
   map.put("img", R.drawable.i2);
   list.add(map);
   map = new HashMap<String, Object>();
   map.put("title", "G3");
   map.put("info", "google 3");
   map.put("img", R.drawable.i3);
   list.add(map);
   return list;
  }
 }

使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局vlist.xml。下面做适配,new一个SimpleAdapter参数一次是:this,布局文件(vlist.xml),HashMap的 title 和 info,img。布局文件的组件id,title,info,img。布局文件的各组件分别映射到HashMap的各元素上,完成适配。

运行效果如下图:

3)SimpleCursorAdapter


public class SimpleCursorAdapterActivity extends ListActivity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   //获得一个指向系统通讯录数据库的Cursor对象获得数据来源
   Cursor cur = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
   startManagingCursor(cur);
   //实例化列表适配器
   ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cur, new String[] {People.NAME}, new int[] {android.R.id.text1});
   setListAdapter(adapter);
  }
 }

 一定要以数据库作为数据源的时候,才能使用SimpleCursorAdapter,这里特别需要注意的一点是:不要忘了在AndroidManifest.xml文件中加入权限


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

效果如下:

4)BaseAdapter

有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。下面的示例将显示一个按钮和一个图片,两行字如果单击按钮将删除此按钮的所在行。并告诉你ListView究竟是如何工作的。

vlist2.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">
  <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5px"/>
  <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content">
   <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:textColor="#FFFFFFFF" android:textSize="22px" />
   <TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:textColor="#FFFFFFFF" android:textSize="13px" />
  </LinearLayout>
  <Button android:id="@+id/view_btn" android:layout_width="wrap_content" android:layout_height="wrap_content"
   android:text="@string/s_view_btn" android:layout_gravity="bottom|right" />
 </LinearLayout>


 public class MyListView4 extends ListActivity {
  private List<Map<String, Object>> mData;
  @Override
  public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   mData = getData();
   MyAdapter adapter = new MyAdapter(this);
   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("title", "G1");
   map.put("info", "google 1");
   map.put("img", R.drawable.i1);
   list.add(map);
   map = new HashMap<String, Object>();
   map.put("title", "G2");
   map.put("info", "google 2");
   map.put("img", R.drawable.i2);
   list.add(map);
   map = new HashMap<String, Object>();
   map.put("title", "G3");
   map.put("info", "google 3");
   map.put("img", R.drawable.i3);
   list.add(map);
   return list;
  }
  // ListView 中某项被选中后的逻辑
  @Override
  protected void onListItemClick(ListView l, View v, int position, long id) {
   Log.v("MyListView4-click", (String)mData.get(position).get("title"));
  }
  
  public void showInfo(){
   new AlertDialog.Builder(this)
   .setTitle("我的listview")
   .setMessage("介绍...")
   .setPositiveButton("确定", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
    }
   })
   .show();
  }
  public final class ViewHolder{
   public ImageView img;
   public TextView title;
   public TextView info;
   public Button viewBtn;
  }
  public class MyAdapter extends BaseAdapter{
   private LayoutInflater mInflater;
   public MyAdapter(Context context){
    this.mInflater = LayoutInflater.from(context);
   }
   @Override
   public int getCount() {
    // TODO Auto-generated method stub
    return mData.size();
   }
   @Override
   public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return null;
   }
   @Override
   public long getItemId(int arg0) {
    // TODO Auto-generated method stub
    return 0;
   }
   @Override
   public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    if (convertView == null) {
     holder=new ViewHolder(); 
     convertView = mInflater.inflate(R.layout.vlist2, null);
     holder.img = (ImageView)convertView.findViewById(R.id.img);
     holder.title = (TextView)convertView.findViewById(R.id.title);
     holder.info = (TextView)convertView.findViewById(R.id.info);
     holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
     convertView.setTag(holder);
    }else {
     holder = (ViewHolder)convertView.getTag();
    }
    holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
    holder.title.setText((String)mData.get(position).get("title"));
    holder.info.setText((String)mData.get(position).get("info"));
    holder.viewBtn.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
      showInfo();    
     }
    });
    return convertView;
   }
  }  
 }

下面将对上述代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。

系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了。

效果如下:

您可能感兴趣的文章:Kotlin编写Android适配器AdapterAndroid自定义viewgroup 使用adapter适配数据(6)Android ListView适配器(Adapter)优化方法详解Android设计模式之适配器(Adapter)模式Android Adapter的几个常用方法简单好用的Adapter---ArrayAdapter详解


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

浅析Android之Adapter用法总结

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

浅析Android之Adapter用法总结

1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、Vi
2022-06-06

Android控件之SeekBar的用法总结

1 SeekBar简介 SeekBar是进度条。我们使用进度条时,可以使用系统默认的进度条;也可以自定义进度条的图片和滑块图片等。 2 SeekBar示例 创建一个activity,包含2个SeekBar。第1个SeekBar是系统默认的S
2022-06-06

Android开发之TextView控件用法实例总结

本文实例总结了Android开发之TextView控件用法。分享给大家供大家参考,具体如下: TextView控件可以向用户展现文本信息,我们可以设置该文本信息是否能编辑 1、TextView基本使用 在程序中创建TextView对象 在x
2022-06-06

Android开发之资源文件用法实例总结

本文实例总结了Android开发之资源文件用法。分享给大家供大家参考,具体如下: 这里记录在Android开发中经常用到的一些用法 arrays.xml定义数组 例:
2022-06-06

Android Notification使用方法总结

Android Notification使用方法总结一. 基本使用1.构造notification NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(a
2023-05-30

Android getSystemService用法实例总结

本文实例分析了Android getSystemService用法。分享给大家供大家参考,具体如下: 1. 说明 android的后台运行在很多service,它们在系统启动时被SystemServer开启,支持系统的正常工作,比如Moun
2022-06-06

C++Struct结构体用法浅析

前边我们所定义的类,均是使用struct关键字来定义,但是C++中真正用于定义类的关键字为class,因为要C++兼容C,所以保留struct关键字,struct与class的用法完全相同
2023-05-13

Android程序开发之WebView使用总结

前言:今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结。使用场景:1.)添加权限2022-06-06

Android Toast的用法总结(五种用法)

Toast大家都很熟,不多说。直接上图上代码。       具体代码如下: main.xml: 2022-06-06

Android开发中Intent用法总结

本文实例讲述了Android开发中Intent用法。分享给大家供大家参考,具体如下: Android手机软件开发中,Intent作为手机软件开发时很重要的对象需要引起我们的重视,实际上,intent也是体现Android开发具有其独特性的一
2022-06-06

Android Notification的多种用法总结

Android Notification的多种用法总结我们在用手机的时候,如果来了短信,而我们没有点击查看的话,是不是在手机的最上边的状态栏里有一个短信的小图标提示啊?你是不是也想实现这种功能呢?今天的Notification就是解决这个问
2023-05-31

Android中Notification用法实例总结

本文实例总结了 Android中Notification用法。分享给大家供大家参考,具体如下: 我们在用手机的时候,如果来了短信,而我们没有点击查看的话,是不是在手机的最上边的状态栏里有一个短信的小图标提示啊?你是不是也想实现这种功能呢?今
2022-06-06

Android WebView的使用方法总结

Android WebView的使用方法 Android app打开H5页一般要实现如下需求:1、打开指定url网页;2、点击链接可以跳转到下一页,并更新标题;3、按back键或左箭头可以返回上一页;4、当webview显示的是第一级u
2023-05-30

Android onCreateOptionsMenu的使用方法总结

Android onCreateOptionsMenu的使用方法总结任何一款软件都少不了对“菜单”的使用。在Android下,每一个activity都捆绑了一个Menu,要想定义和使用菜单,都必须在Activity下进行操作,复写onCre
2023-05-30

Android 解析XML 文件的四种方法总结

java解析xml文件四种方式1.介绍 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。
2022-06-06

浅谈Spring @Async异步线程池用法总结

本文介绍了Spring @Async异步线程池用法总结,分享给大家,希望对大家有帮助1. TaskExecutorspring异步线程池的接口类,其实质是Java.util.concurrent.ExecutorSpring 已经实现的异常
2023-05-31

Android中Canvas的常用方法总结

一、对Canvas进行操作对Canvas的一系列操作,是指对Canvas进行旋转、平移、缩放等操作。这些操作可以让Canvas对象使用起来更加便捷。 二、Canvas平移/** * 画布向(100,50)方向平移 * * 参数1: 向X轴方
2022-06-06

Android中异步类AsyncTask用法总结

本文总结分析了Android中异步类AsyncTask用法。分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独享,一并发在这里与大家共勉 这里有两种解
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录