第二周学习的是ListView,在各种app的使用很多,相关的内容也很多。需要好好学习。
使用ListView的步骤:
一、添加ListView控件,findViewById
二、适配器:需要context,list_item.xml,数据源。也是适配器在一个contex中如何将数据源和list_item.xml进行适配
三、listview绑定监听器

<!--android:background="@color/red"   背景和分割线,都可以选择设置颜色和图片android:divider="@color/white"   设置分割线颜色为透明,分割线消失android:dividerHeight="1px"   分割线的高度,为0dp时分割线消失,-->
<ListView
android:id="@+id/list_view"
android:background="@color/red"
android:divider="@color/white"
android:dividerHeight="1px"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>

第一步和第三步都很简单,今天主要介绍一下第二步,ListView中非常关键的三个Adapter,分别是ArrayAdapter,SimpleAdapter,BaseAdapter.
适配器的作用,就是把复杂的数据填充在指定的视图界面上。数据从数组,链表,集合和数据库等等。

第一个Adapter,ArrayAdapter,使用的是最简单的,用于绑定格式单一的数据。数据源是:集合和数组
需要:1.context 2.数据:一个数组 3.布局:android自带布局

  /*** 数据源:一个string数组*/private String[] names={"初音未来","叶萌君","辣小丫宫廷版","嗷大喵第三季","嗷大喵红包篇","想念熊喜欢你","长草颜团子日常","功夫熊猫重出江湖","蛋黄哥","阿狸"};/*** 参数1,context,参数2,android自带的一个item布局,参数3,string数组*/ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,names);                    

第二个Adapter ,是SimpleAdapter
需要: 1.context,2.数据:一个装有map的list,3.布局:自定义一个list_item.xml

    // 准备一个list来存放数据private List<Map<String,Object>> mHashMapArrayList=new ArrayList<>();private SimpleAdapter mSimpleAdapter;// 将图片资源打包成一个数组private int[] mImages= { R.drawable.address_book,R.drawable.calendar, R.drawable.camera, R.drawable.clock,R.drawable.games_control,R.drawable.messenger,R.drawable.ringtone,R.drawable.settings, R.drawable.speech_balloon, R.drawable.weather};//  将文本资源打包成一个数组private String[] names={"初音未来","叶萌君","辣小丫宫廷版","嗷大喵第三季","嗷大喵红包篇","想念熊喜欢你","长草颜团子日常","功夫熊猫重出江湖","蛋黄哥","阿狸"};/***  通过for循环将两个数组的数据放到一个map中,然后再添加到list中* 一个map就相当于一个数据的item和视图item相对应。*/for(int i=0;i<names.length;i++){Map<String ,Object> map=new HashMap<>();//    此处可以放多个map,一个item里面有几个数据,控件,放几个mapmap.put("name",names[i]);map.put("image",mImages[i]);mHashMapArrayList.add( map);}/*** 参数1,context, 参数2,数据* 参数3,自定义的item布局,一个imageview一个textview* 参数4,和参数5是相对应的,一个是map键组成的数组,一个是item控件id组成的数组* 注意:键的数据和控件一定要对应*/mSimpleAdapter=new SimpleAdapter(this,mHashMapArrayList,R.layout.list_item,new String[]{"name","image"},new int[]                                                                                {R.id.list_item_name,R.id.list_item_image});                         

第三个 Adapter BaseAdapter
需要:1.context, 2.数据:list中放入Face类 ,3.布局:自定义item.xml
一个存储数据的类,里面的构造方法和set,get方法就不贴了。

public class Face {private int image;private String name;private String introduce;}

新建一个类,继承BaseAdapter

/*** 此前都是在activity中直接操作,这次adapte是新建外部类继承BaseAdapter*/
public class MyAdapter extends BaseAdapter {private Context mContext;
//    用来将xml文件转为View对象,从而可以获取其控件,并设置数据private LayoutInflater mLayoutInflater;
//    这个存储数据的list里面装的是Face类,你需要新建一个类,就是一条Item的数据private ArrayList<Face>  mArrayList;public MyAdapter(Context context,ArrayList<Face>  faces){mContext=context;mLayoutInflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);mArrayList=faces;}@Overridepublic int getCount() {return mArrayList.size();}@Overridepublic Object getItem(int position) {return mArrayList.get(position);}@Overridepublic long getItemId(int position) {return position;}/*** 最重要的一个方法,将一个item的xml转为view,通过view找到它的控件,将list中的数据设置给它*/@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder=new ViewHolder();if(convertView==null){// 这个item布局是一个imageview,两个textview,一个button,位置随意。 button不需要find,设置数据,都是一样的convertView=mLayoutInflater.inflate(R.layout.list_item,null);viewHolder.imageView    = (ImageView)convertView.findViewById(R.id.list_item_image);viewHolder.nameText     = (TextView) convertView.findViewById(R.id.list_item_name);viewHolder.introduceText  = (TextView) convertView.findViewById(R.id.list_item_introduce);viewHolder.loadButton       = (Button) convertView.findViewById(R.id.list_item_load);convertView.setTag(viewHolder);}else {viewHolder= (ViewHolder) convertView.getTag();}viewHolder.imageView.setImageResource(mArrayList.get(position).getImage());viewHolder.nameText.setText(mArrayList.get(position).getName());viewHolder.introduceText.setText(mArrayList.get(position).getIntroduce());return convertView;}class ViewHolder{ImageView imageView;TextView nameText;TextView introduceText;Button  loadButton;}
}

在activity中操作

   private MyAdapter mMyAdapter;private ArrayList<Face> faces=new ArrayList<>();/*** 准备数据,for循环,建10个face对象,存进list中*/for(int i=0;i<10;i++){Face face=new Face(R.drawable.address_book,"温暖调皮的小狐狸","阿狸");faces.add(face);}
//        参数1.context, 参数2,数据mMyAdapter=new MyAdapter(this,faces);

可能BaseAdapter中的getView方法是比较难懂的。那它方法的第一步是通过一个InFlatre对象,将item的xml转换为View对象,然后第二步是通过这个View对象找到它的子控件对象,然后第三部给这些子控件设置属性显示到界面中(通过数据)。

那因为listview会有很多item,每个item需要adapter调用一次getView方法,创建一个View对象,必将占用很多内存,因此有做了相关的优化。

优化一,设置判断条件,convertView为空时,我们创建view对象,并setTag.当下次listview再次滑动这个item时,convertView不为空,我们就可以从getTag中取出,不用再次创建。
优化二、使用ViewHolder, 因为有了View对象,在findViewById()方法是一个树查找过程,耗时操作,也需要优化。方法是,在创建View对象,实例化每一个控件时,将其保存到ViewHolder对象中,然后setTag。在下次需要时,直接getTag取出就可以。

GeekBand第二周 ListView(上)相关推荐

  1. 【中英】【吴恩达课后测验】Course 2 - 改善深层神经网络 - 第二周测验

    [中英][吴恩达课后测验]Course 2 - 改善深层神经网络 - 第二周测验 上一篇: [课程2 - 第一周编程作业]※※※※※ [回到目录]※※※※※下一篇: [课程2 - 第二周编程作业] 第 ...

  2. 深度学习笔记第一门课第二周:神经网络的编程基础(上)

    本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...

  3. MySQL查询今日、昨日、前日、本周、上周、本月、上月、本季度、上季度、本年、去年、第一周、第二周的数据

    今日 SELECT * FROM 表 WHERE DATEDIFF(NOW(),字段) = 0 昨日 SELECT * FROM 表 WHERE DATEDIFF(NOW(),字段) = -1 前日 ...

  4. 思特奇杯·云上蓝桥 -算法 集训营第二周

    思特奇杯·云上蓝桥 -算法 集训营第二周 1. 带分数 题目描述 解法一 解题思路 python代码 2. 李白打酒 题目描述 解法一 解题思路 python代码 3. 第 39 级台阶 题目描述 解 ...

  5. Django 学习小组:博客开发实战第二周教程 —— 实现博客详情页面和分类页面

    本教程内容已过时,更新版教程请访问: django 博客开发入门教程. 上周我们完成了博客的 Model 部分,以及 Blog 的首页视图 IndexView. 本节接上周的文档 Django 学习小 ...

  6. 20155222 第二周测试

    20155222 第二周测试 1 vi 每个.c一个文件,每个.h一个文件,文件名中最好有自己的学号 用Vi输入图中代码,并用gcc编译通过 在Vi中使用K查找printf的帮助文档 提交vi编辑过程 ...

  7. Linux第二周学习笔记(7)

    Linux第二周学习笔记(7) 2.13 文档查看cat_more_less_head_tail (1). cat命令 cat命令:用于查看一个文件的内容并将其显示在屏幕上 cat-A命令:显示所有的 ...

  8. Linux第二周学习笔记(11)

    Linux第二周学习笔记(11) 2.17 隐藏权限lsattr_chattr chattr命令:是设置吟唱隐藏权限的命令,更改Linux文件系统上的文件属性. 参数说明: A:表示文件或目录的ati ...

  9. LINUX内核分析第二周学习总结——操作系统是如何工作的

    LINUX内核分析第二周学习总结--操作系统是如何工作的 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/course ...

最新文章

  1. PointPillar:利用伪图像高效实现3D目标检测
  2. SAP MM 模块调研问卷样例
  3. word2vec 中的数学
  4. 14行代码AC——习题5-4 交换学生(Foreign Exchange, UVa 10763)——解题报告
  5. java解决错误经验_在Java错误进入生产之前的新处理方式
  6. 把一个结构体当做属性后碰到的问题
  7. linux php oauth安装,Linux php 扩展安装 mongo ,redis ,soap,imap,pdo_mysql,oauth
  8. 如何用鲲鹏弹性云服务器部署《Hadoop伪分布式》
  9. python函数库 阶跃 信号函数 调用_有没有大神知道 step2 阶跃响应函数的 里面的T的怎么定义...
  10. NetworkManager概述
  11. 解题:洛谷3402 可持久化并查集
  12. HTTP协议学习,post于get;用Fiddler测试请求
  13. springboot2.4+nettyWebServerApplicationContext@15f51c50 has been closed already问题解决
  14. Android打开pdf文件
  15. 博士申请 | 美国达特茅斯学院杨耀青老师招收深度学习方向全奖博士生
  16. 大学计算机专业那些课 --左飞
  17. android sdk tools是什么意思,android sdk tools有什么用
  18. 阿里滑块 x82y x5sec本地dll 易语言
  19. 什么是正价元素和负价元素??
  20. 30天突破英语口语!(MP3版)

热门文章

  1. 适合四季畅饮的饮料 体动果味苏打水
  2. 数据存储之Archiver、Unarchiver、偏好设置
  3. 使用Javascript制作声音按钮 1
  4. 【算法leetcode】2325. 解密消息(rust和go重拳出击)
  5. python 发送邮件 163_python练习-使用163邮箱发送邮件
  6. 用php实现日历输出,php 实现日历
  7. 【IOS】自己写的一个舒尔特方格app
  8. 关于shaderLab中 tags(标签)
  9. 计算机网络配置与应用教学设计,计算机网络与应用教学设计
  10. 子网划分和计算方法(附习题详解)