android中Adapter适配器的讲解

Adapter(适配器的讲解)

适配器就我自己来看,我觉得这是一个非常重要的知识点,Adapter是用来帮助填出数据的中间桥梁,简单点说吧:将各种数据以合适的形式显示在View中给用户看。Adapter有很多的接口、抽象类、子类可以使用,这里就我们常用的几个进行讲解

BaseAdapter,ArrayAdapter,SimpleAdapter,为了配合讲解这几个适配器,这里提前使用一下ListView来展示一下适配器的使用,后面会对ListView进行进一步总结。

一、ArrayAdapter(数组适配器),这个适配器使用有一定的局限性,只能显示一行文本数据

(1)基本使用实例

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ListViewandroid:id="@+id/ll1"android:layout_width="match_parent"android:layout_height="wrap_content"></ListView>
</LinearLayout>

Java文件

package com.example.test3;import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;public class MainActivity extends Activity{
//    定义要显示的数据private String[] datas = {"张三","李四","王五","麻子","小强"};private ArrayAdapter<String> adapter;private ListView listView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = (ListView) findViewById(R.id.ll1);
//        初始化适配器adapter = new ArrayAdapter<>(this,android.R.layout.simple_expandable_list_item_1,datas);listView.setAdapter(adapter);}
}

效果图:

(2)实现上面还可以先在res\value下创建一个数组资源的xml文件:arrays.xml,然后在listview中使用entries

3、ArrayAdapter也支持泛型,那么集合肯定必须的,还可以如下所写

4、ArrayAdapter的参数说明:

第一个参数:context上下文对象

第二个参数:每一个item的样式,可以使用系统提供,也可以自定义就是一个TextView

第三个参数:数据源,要显示的数据

系统提供的item的样式,可以试一试

simple_list_item1:单独的一行文本框

simple_list_item2:有两个文本框组成

simple_list_item_checked每项都是由一个已选中的列表项

simple_list_item_multiple_choice:都带有一个复选框

simple_list_item_single_choice:都带有一个单选框

二、SimpleAdapter(简单适配器):这个适配器不要被名字迷惑,看是简单,但功能强大

(1)基本使用实例

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ListViewandroid:id="@+id/ll1"android:layout_width="match_parent"android:layout_height="wrap_content"></ListView>
</LinearLayout>

定义要实现的item的样式

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:id="@+id/image1"android:layout_width="100dp"android:layout_height="100dp"android:src="@mipmap/ic_launcher"android:layout_margin="5dp"/><LinearLayoutandroid:id="@+id/ll2"android:layout_width="match_parent"android:layout_height="100dp"android:orientation="vertical"android:layout_marginTop="5dp"android:layout_marginLeft="10dp"><TextViewandroid:id="@+id/text1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="哈哈"android:textSize="30sp"android:layout_marginTop="10dp"/><TextViewandroid:id="@+id/text2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="哈哈哈哈哈"android:textSize="24dp"android:layout_marginTop="10dp"/></LinearLayout>
</LinearLayout>

Java文件

package com.example.test3;import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class MainActivity extends Activity{
//    这三个经常是同时出现的private List<Map<String,Object>> lists;private SimpleAdapter adapter;private ListView listView;
//    定义数据private String[] theme = {"张三","李四","王五"};private String[] content ={"我是张三,你好","我是李四,你好","我是王五,你好"};private int[] imageViews = {R.mipmap.ic_launcher,R.mipmap.ic_account,R.mipmap.ic_password};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = (ListView) findViewById(R.id.ll1);
//        准备数据源lists = new ArrayList<>();for(int i = 0;i < theme.length;i++){Map<String,Object> map =new HashMap<>();map.put("image",imageViews[i]);map.put("theme",theme[i]);map.put("content",content[i]);lists.add(map);}adapter = new SimpleAdapter(MainActivity.this,lists,R.layout.list_item,new String[]{"image","theme","content"},new int[]{R.id.image1,R.id.text1,R.id.text2});listView.setAdapter(adapter);}
}

效果图:

(2)simpleAdapter中五个参数的

第一个参数:上下文对象

第二个参数:数据源是含有Map的一个集合

第三个参数:每一个item的布局文件

第四个参数:new String[]{}数组,数组的里面的每一项要与第二个参数中的存入map集合的的key值一样,一一对应

第五个参数:new int[]{}数组,数组里面的第三个参数中的item里面的控件id。

三、BaseAdapter使用的非常多,现在使用BaseAdapter也同样的实现上面的效果。

(1)布局文件和每一个item的显示都和上面SimpleAdapter一样的主要是在Java里面的文件,在使用BaseAdapter我们继承它,并且实现里面抽象方法。

自定义adapter

package com.example.test3;import android.content.Context;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import java.util.ArrayList;
import java.util.List;/*** Created by coder-tu on 2016/1/13.*/
public class MyAdapter extends BaseAdapter {private List<Message> Datas;private Context mContext;public MyAdapter(List<Message> datas, Context mContext) {Datas = datas;this.mContext = mContext;}/*** 返回item的个数* @return*/@Overridepublic int getCount() {return Datas.size();}/*** 返回每一个item对象* @param i* @return*/@Overridepublic Object getItem(int i) {return Datas.get(i);}/*** 返回每一个item的id* @param i* @return*/@Overridepublic long getItemId(int i) {return i;}/*** 暂时不做优化处理,后面会专门整理BaseAdapter的优化* @param i* @param view* @param viewGroup* @return*/@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {view = LayoutInflater.from(mContext).inflate(R.layout.list_item,viewGroup,false);ImageView imageView = (ImageView) view.findViewById(R.id.image1);TextView textView1 = (TextView) view.findViewById(R.id.text1);TextView textView2 = (TextView) view.findViewById(R.id.text2);imageView.setImageResource(Datas.get(i).getImageId());textView1.setText(Datas.get(i).getTheme());textView2.setText(Datas.get(i).getContent());
//        此处需要返回view 不能是view中某一个return view;}
}

然后在Java文件中使用

package com.example.test3;import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;import java.util.ArrayList;
import java.util.List;public class MainActivity extends Activity{
//    这三个经常是同时出现的private List<Message> lists;private MyAdapter adapter;private ListView listView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listView = (ListView) findViewById(R.id.ll1);lists = new ArrayList<>();lists.add(new Message(R.mipmap.ic_launcher,"张三","你好,我是张三"));lists.add(new Message(R.mipmap.ic_account,"李四","你好,我是李四"));lists.add(new Message(R.mipmap.ic_password,"王五","你好,我是王五"));adapter = new MyAdapter(lists,MainActivity.this);listView.setAdapter(adapter);}
}

效果图:

(2)关于BaseAdapter里面的方法在Java代码中已经描述的很详细了

(3)对BaseAdapter的优化:三个模式(逗比式,普通式,文艺式)

逗比式:上面没有做任何优化,简称逗比式,他没有利用listView的缓存机制, view重复创建findviewbyid反复使用,代码就是上面没有优化的。

普通式:充分利用listview的缓存机制但是findviewbyid反复使用

文艺式:这种写法非常好,即利用了listView的缓存机制,又避免了重复的findViewById

1、创建内部类 2、判断convertView是否为空 3通过setTag方法将viewHolder与convertView建立关系绑定

小结:对这三种适配器来说,BaseAdapter使用相对最广,因为局限性小,使用起来更加自由

android中Adapter适配器的讲解相关推荐

  1. Android中Adapter适配器的介绍以及用法的总结

    Adapter(适配器的讲解) 适配器就我自己来看,我觉得这是一个非常重要的知识点,Adapter是用来帮助填出数据的中间桥梁,简单点说吧:将各种数据以合适的形式显示在View中给用户看.Adapte ...

  2. Android学习——Adapter适配器

    AdapterView: 容器控件,其整体效果由每一个子元素内容决定,子元素的形式由Adapter决定. AdapterView的子视图对象: ListView:以垂直滑动列表形式显示一组数据. Gr ...

  3. android中图片适配器,Android UI适配总结之图片适配(1)

    由于Android的屏幕尺寸的碎片化,时至今日Android的UI适配依然是开发中必不可少的步骤. UI适配的适配,是通过dp.权重,通配符等方式使View能按我们意愿的准确的显示在不同手机上.除了对 ...

  4. Android中Adapter的notifyDataSetInvalidated()和notifyDataSetChanged()的区别

    notifyDataSetChanged方法通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容. public void notifyDataSetChan ...

  5. 什么是token?Android中token的使用讲解

    通过本篇可以基本掌握使用token,下面就来一步一步开始学会使用吧! Token(计算机术语) 在计算机身份认证中是令牌(临时)的意思,在词法分析中是标记的意思. 数据处理 token其实说的更通俗点 ...

  6. Android中动画的详细讲解

    逐帧动画: 补间动画 结合动画 自定义动画 属性动画一 属性动画二 动画三 动画四 逐帧动画 语法格式 MainActivity代码 补间动画Tween Animation子类 interpolato ...

  7. 关于android中postDelayed方法的讲解

    这是一种可以创建多线程消息的函数 使用方法: 1,首先创建一个Handler对象 Handler handler=new Handler(); 2,然后创建一个Runnable对象 Runnable ...

  8. Android中Kotlin面试问题讲解

    1.Kotlin到底是什么 <1>Kotlin是一种基于JVM的编程语言,它和Java一样,都是一种静态类型的语言,它完全兼容Java. <2>Kotlin也是对Java的一种 ...

  9. 【Android】 Android中适配器简介

    1. BaseAdapter的使用实例 BaseAdapter baseAdapter = new BaseAdapter() {@Overridepublic View getView(int po ...

最新文章

  1. 我的java开发规范
  2. 哪个是更早的时间 date_淘宝用户行为分析(漏斗模型+pv,uv,pv/uv,复购率,用户活跃时间段)...
  3. OpenGL 延迟着色法Deferred Shading
  4. Python数据库的连接
  5. SAP Spartacus 404 Not found页面的显示机制 - canActivateNotFoundPage
  6. Log and display Log text type in Account Overview page
  7. 线程间通信之eventfd
  8. [笔记][原创]Verilog HDL语法分析笔记
  9. 总结一下在ASP.NET中开发网站的一般步骤
  10. [Hadoop in China 2011] 淘宝OceanBase打造结构化NoSQL数据库
  11. qualifiers
  12. java 在pdf中插入图片_新手教程!如何在PDF文件中插入图像
  13. 云端虚拟机规格参数快速对比说明
  14. Numerical Optimization Ch17. Penalty and Augmented Lagragian Methods
  15. 数据采样 22382份,如何才能学好Python并找到工作
  16. 解读 蒲慕明院士意义非凡的脑科学
  17. Python使用GDAL矢量裁剪栅格,设置背景值为空白(已解决)
  18. 4、Cas Server的配置文件
  19. java实现kfc点餐系统
  20. HTTP权威指南 - Web机器人

热门文章

  1. Keil5 software packs和legacy device database分类讲解
  2. python : 将txt文件中的数据读为numpy数组或列表
  3. c语言复杂函数转换,详解C语言常用的一些转换工具函数.pdf
  4. android 拍摄二维码图片 变形矫正_鼻中隔先天偏曲矫正特殊案例——我为何给她做了两次手术...
  5. 虚拟机状态错误_【行业资讯】VirtualBox 6.1.16 发布,开源虚拟机
  6. mysql8.1改密码,mysql 8.0以上版本修改root密码的方法
  7. Python学习---入门导学篇
  8. Kafka三款监控工具比较
  9. 深入浅出JS:Two
  10. [luoguP2463] [SDOI2008]Sandy的卡片(后缀数组 + st表)