列表控件是Android中最常见的控件之一

由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示的时候,就可以借助各种列表控件来实现。

 <ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="match_parent" />

显示可垂直滚动的视图集合,其中每个视图都位于列表中紧靠前一个视图的下方。

列表视图是一种适配器视图,它不知道它所包含的视图的详细信息,比如类型和内容。为了在列表中显示项目,调用setAdapter将适配器与列表关联起来。

要为数据集中的每个项显示更自定义的视图,请实现一个ListAdapter。

列表控件一般包括ListView,GridView,以及目前用来代替前二者的RecycleView。

11.1、列表样式

样例:

1.前端写死

布局文件:

 <ListViewandroid:id="@+id/listview1"android:layout_width="match_parent"android:layout_height="wrap_content"android:divider="#C4C4C4"android:entries="@array/teacher_name"android:dividerHeight="1dp"></ListView>
  • divider:行分割线颜色

  • dividerHeight:分割线宽度

  • entries:数据入口参数(使用资源文件引用)

资源文件编写:

 <?xml version="1.0" encoding="utf-8"?><resources><!--添加数组元素--><string-array name="teacher_name"><item>董二</item><item>张三</item><item>李四</item><item>王五</item><item>赵六</item>        </string-array></resources>

通过定义一个字符串数组来存放字符串数据

2.后端获取显示

布局文件:

 <ListViewandroid:id="@+id/listview1"android:layout_width="match_parent"android:layout_height="wrap_content"android:divider="#C4C4C4"        android:dividerHeight="1dp"></ListView>

去掉数据源,样式保留

后端数据获取:

在这里直接给出数据,此处数据可由网络获取,也可由数据库获取

ArrayAdapter

 protected void onCreate(Bundle savedInstanceState) {//dongyh Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.arradp2);String str[] = {"Tom","Jerry","Mike","John","dongyh"};//创建ArrayAdapter对象ArrayAdapter<Object> aa= new ArrayAdapter<Object>(this, android.R.layout.simple_list_item_1, str);ListView lv = (ListView)this.findViewById(R.id.listview1);//通过setAdapter函数实现赋值lv.setAdapter(aa);}

源码构造方法

 public ArrayAdapter (Context context, int resource, T[] objects)/*para1:context:组件引用,即当前activity页面para2:resource:列表控件的布局样式,这里使用了Android类库中定义的样式注:这一类样式本身是Android系统自用的,不提倡在App中引用para3:objects:数据资源集您可以使用此适配器为AdapterView提供视图,为您提供的数据对象集合中的每个对象返回视图,并可与基于列表的用户界面小部件(如ListView或Spinner)一起使用。*/

ArrayAdapter绑定的数据是集合或数组,比较单一

SimpleAdapter

 //姓名private String[] name={"张三","李四","王五"};//爱好private String[] desc={"跳舞","打球","跑步"}; //图标数组private int[] icon=new int[]{R.drawable.icon1,R.drawable.icon2,R.drawable.icon3};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.ly_exp2);//通过list对象来存储每一行的信息,list中用map对象通过键值对来对应存放信息List<Map<String,Object>> list= new ArrayList<Map<String,Object>>();​for(int i=0;i<name.length;i++){Map<String, Object> listitem=new HashMap<String, Object>();//key:string,value:objectlistitem.put("icon",icon[i]);listitem.put("name",name[i]);listitem.put("desc",desc[i]);list.add(listitem);}    //设置listview内容要为其定义一个适配器//这里使用SimpleAdapter适配器来进行数据赋值//一个简单的适配器,可以将静态数据映射到XML文件中定义的视图。SimpleAdapter sa = new SimpleAdapter(this,list,R.layout.ly_mylv,new String[]{"desc","icon","name"},new int[]{R.id.dexc,R.id.icon,R.id.name});   //通过设置适配器给listview赋值((ListView)findViewById(R.id.mylv)).setAdapter(sa); }

源码构造方法:

 public SimpleAdapter (Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
参数 含义
context 与此SimpleAdapter关联的视图正在运行的上下文
data 地图列表。List中的每个条目对应于列表中的一行。map包含每一行的数据,并且应该包括from中指定的所有条目
resource 视图布局的资源标识符,它定义了这个列表项的视图。布局文件至少应该包括那些在to中定义的命名视图
from 将添加到与每个项目关联的Map中的列名列表。
to from参数的数据对应放置。都是TextView类型。这个列表中的前N个视图被赋予from参数中的前N个列的值。

自定义Adapter

要为数据集中的每个项显示自定义的视图,请实现一个ListAdapter。

BaseAdapter:Adapter的公共实现的公共基类,它可以在ListView(通过实现专用的ListAdapter接口)和Spinner(通过实现专用的SpinnerAdapter接口)中使用。

 private class MyAdapter extends BaseAdapter {​// override other abstract methods here​@Overridepublic View getView(int position, View convertView, ViewGroup container) {if (convertView == null) {convertView = getLayoutInflater().inflate(R.layout.list_item, container, false);}//对象赋值((TextView) convertView.findViewById(android.R.id.text1)).setText(getItem(position));return convertView;}}

其中的getview方法是Adapter类下的

 public abstract View getView (int position, View convertView, ViewGroup parent)

获取一个视图,显示数据集中指定位置的数据。你可以手动创建一个视图,也可以从XML布局文件中扩展它。

参数
position int:我们想要查看的项目的适配器数据集中项目的位置。
convertView View:如果可能的话,要重用旧视图。注意:在使用之前,您应该检查此视图是否为非空且类型合适。如果无法将此视图转换为显示正确的数据,则此方法可以创建一个新视图。
parent ViewGroup:此视图最终将附加到的父级

当视图被膨胀时,父视图(GridView, ListView…)将应用默认的布局参数,除非你使用

LayoutInflater.inflate(int, android.view.ViewGroup, boolean)来指定根视图并防止附加到根视图。

 public View inflate (int resource, ViewGroup root, boolean attachToRoot)

从指定的xml资源膨胀一个新的视图层次结构。

参数
resource int: 要加载的 XML 布局资源的 ID(例如 )R.layout.main_page
root ViewGroup: 作为生成层次结构的父级的可选视图(如果 attachToRoot为 true),或者只是为返回的层次结构的根提供一组 LayoutParams 值的对象(如果attachToRoot为 false。)此值可能是null.
attachToRoot boolean: 膨胀的层次结构是否应该附加到根参数?如果为 false,则 root 仅用于为 XML 中的根视图创建正确的 LayoutParams 子类。

当我们的自定义的适配器在绘制当前指定的item时会自动调用getview函数

public class excer3_basep1 extends BaseAdapter {Context context;List<Map<String,Object>> list;public excer3_basep1(Context context, List<Map<String,Object>> list) {super();this.context=context;this.list=list;}//设置列表控件对应不同数据需要重复绘制的次数,即item的个数@Overridepublic int getCount() {return list.size();}​//针对每个item的操作@Overridepublic Object getItem(int i) {return null;}@Overridepublic long getItemId(int i) {return 0;}//负责为每个item对应的数据加以绘制@Overridepublic View getView(int position, View convertView, ViewGroup container) {if (convertView == null) {//convertView 系统传入的一个View对象,该对象作为某一个item的显示(绘制)的对象convertView = LayoutInflater.from(context).inflate(R.layout.exp3_lvly1, container, false);//.from:标记所要填充的组件//inflate是安卓将xml实例化(转换代码)的工具。}//通过convertView视图转换器获取布局对象ImageView icon=((ImageView) convertView.findViewById(R.id.exp3_lvly1_icon));TextView name=(TextView) convertView.findViewById(R.id.exp3_lvly1_name);TextView hobby=(TextView) convertView.findViewById(R.id.exp3_lvly1_hobby);//赋值icon.setImageResource((Integer) list.get(position).get("icon"));name.setText(list.get(position).get("name").toString());hobby.setText(list.get(position).get("hobby").toString());return convertView;}}

代码优化:

convertView

Adapter的getView()方法中每次都将布局重新加载了一遍,当ListView快速滚动时,就会称为性能的瓶颈

getView()中还有一个convertView参数,这个参数用于将之前加载好的布局进行缓存,以便以后可以重用

findViewById

findViewById()函数会在每次调用时,去R文件中搜索相匹配的id号,导致运行效率的降低

新增一个静态内部类ViewHolder,用于对ListView布局中控件的实例进行缓存

convertView为空时,将控件的实例引用都存放在ViewHolder对象里

调用View类中的setTag()函数,将ViewHolder对象与convertView关联起来

 public void setTag (Object tag)//设置与此视图相关联的标记。标记可以用于在层次结构中标记视图,并且在层次结构中不必是唯一的。标记还可以用于在视图中存储数据,而无需求助于其他数据结构。

convertView已经存在后,每次调用getTag()获取ViewHolder对象,并从中获取控件的引用

这样就无需每次都调用findViewById()函数,提高运行效率

 public class ViewHolder{ImageView iv;TextView tv1,tv2;}@Overridepublic View getView(int position, View convertView, ViewGroup container) {ViewHolder vh=new ViewHolder();if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.exp3_lvly1, container, false);vh.iv=((ImageView) convertView.findViewById(R.id.exp3_lvly1_icon));vh.tv1=(TextView) convertView.findViewById(R.id.exp3_lvly1_name);vh.tv2=(TextView) convertView.findViewById(R.id.exp3_lvly1_hobby);convertView.setTag(vh);}else {vh=(ViewHolder) convertView.getTag();}//赋值vh.iv.setImageResource((Integer) list.get(position).get("icon"));vh.tv1.setText(list.get(position).get("name").toString());vh.tv2.setText(list.get(position).get("hobby").toString());return convertView;}

11.2、Toast

 public static Toast makeText (Context context, int resId, int duration)

制作一个只包含资源文本的标准祝酒词。

参数
context Context: 当前的context,通常是你的应用程序或Activity
resId int: 要使用的字符串资源的资源id。
duration int: 该消息显示多长时间。 LENGTH_SHORT or LENGTH_LONG

为每一个列表行设置其显示的文本

 lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {msg="position:"+(i+1)+" name:"+name[i]+" hobby:"+hobby[i];onshow();}});}void onshow(){if(msg!=null)Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();}

总结:

自定义列表控件的大体使用方式:

  1. 获取数据(文件IO,网络,内存或数据库等)

  2. 整理数据成为相应的数据结构,一般为键值对的线性结构

  3. 数据结构是不能直接给列表控件的,需要建立适配器对象,并赋予数据结构

    1. 可以使用类库所提供的适配器对象,直接创建并使用

    2. 若希望自行设计列表样式,需要继承BaseAdapter,并重写相关函数

  4. 将适配器对象赋予列表控件,一般是调用setAdapet函数

Android开发-列表控件相关推荐

  1. android横向列表控件,Android逆天控件:CircleListView(圆弧形列表)

    背景 近日设计师小姐姐创作能力爆棚,设计了一个狂拽酷炫的效果:星球环绕列表.如下图: image 在拿着板砖去沟通,且看到对方40米长的大刀后,愉快地确认出页面的如下特性: 需要实现一个可围绕圆弧(图 ...

  2. android开发重要控件,Android界面编程——Android基本控件

    Android界面编程 Android应用开发的一项重要内容就是界面开发.对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户. 作为一个程序员 ...

  3. Android开发--Spinner控件的使用

    我们经常会在Windows开发的过程中看到一个下拉菜单控件,在Android中也有相应的控件,它的名字叫Spinner,本文介绍Spinner的用法. 首先,下面的这张截图是实现的实例: 在第一行,你 ...

  4. Android开发CheckBox控件,全选,反选,取消全选

    在Android开发中我们经常会使用CheckBox控件,那么怎么实现CheckBox控件的全选,反选呢 首先布局我们的界面: <?xml version="1.0" enc ...

  5. 【按住你的心】——Android开发CheckBoxRadioButton控件的简单使用

    Android的控件很多,我们从最常用的一些控件学起,今天我们学习CheckBox和RadioButton. 首先,我们要在main.xml文件中添加控件: <?xml version=&quo ...

  6. Android开发——RadioButton控件

    一,简介 RadioButton(单选按钮) 如题单选按钮,就是只能够选中一个,所以我们需要把RadioButton放到RadioGroup按钮组中,从而实现 单选功能!先熟悉下如何使用RadioBu ...

  7. Android开发-Spinner控件的使用,spinner设置默认选项

    1 简介: Spinner相当于下拉列表,每一个下拉项都可以供用户选择.Spinner可以是弹出对话框模式,也可以是当前页面显示. 2 效果图: 左图:android:spinnerMode=&quo ...

  8. android tv 开发布局,Android TV开发总结(七)构建一个TV app中的剧集列表控件

    前言:剧集类控件,在TV app中非常常见,今天将介绍构建一个TV app中的剧集列表控件,此控件上传到我的Github:https://github.com/hejunlin2013/Episode ...

  9. android 固定底部 布局_Android系统列表控件

    在android系统控件中,有多个控件可以展示列表数据. 一.ListView 该组件是android中最常用的一个UI组件,用于实现在屏幕上显示多个内容,以便于我们用手指进行滑动. ListView ...

最新文章

  1. am5718_AM5718如何扩大内存 - Sitara™ Cortex-A8 和 ARM9 微处理器 - Sitara™ Cortex-A8 和 ARM9 微处理器 - E2E™ 中文支持论坛...
  2. 重磅日程公布!与百名大咖在线交流技术,2天20个AI论坛不可错过
  3. Linux Shell脚本入门教程系列之(十五) Shell函数简介
  4. JDBC的DML增删改查的代码重构设计(上)
  5. WCF 4.0 进阶系列 – 第十六章 使用回调合约发布和订阅事件(第二部分)
  6. 使用for of循环遍历获取的nodeList,配置babel编译,webpack打包之后在iphone5下报错...
  7. Zero Sum chapter 2.3 dfs
  8. 前端特效-霓虹灯按钮
  9. oracle数据库year函数怎么用,数据库 year函数
  10. 注册一个北京公司可以申请办理京牌吗,好申请吗?
  11. 网站SEO优化知识梳理
  12. 认识研发数字化管理(数字化研发管理)
  13. 不带头结点建立单链表(头插法、尾插法)
  14. 可以免费自学编程的12个网站,祝你达巅峰
  15. gost搭建正向代理及配置
  16. 嵌入式分享合集122
  17. 节日H5游戏案例赏析
  18. 高温液压油缸用什么材料比较合适
  19. 项目——排队叫号系统设计
  20. 小程序毕设随笔-bindtap和catchtap问题

热门文章

  1. 安装texlive遇到中文系统名的问题:open(>C:\Users\**\AppData\Local\Temp\S_Dmsx82uz\mYrZUHgkXu/texlive.infra.w
  2. 我的世界java18w50a_Minecraft我的世界Java版18w47a更新发布
  3. 数据分析报告怎么写(下)
  4. 中关村推出“1+6”系列先行先试改革政策
  5. BFS——Flood Fill模型及最短路模型
  6. MTK-voice最大音量通话-免提切到耳机模式后音量变小问题总结
  7. css文字竖向且英文字母不倒向
  8. 基于图神经网络的节点表征
  9. 经典韦特塔罗牌 豪华经典版78张牌塔罗牌+手册+桌布+光碟塔罗牌
  10. 开题报告之修改意见和心得体会(下)