ListView 概念:
ListView是Android中最重要的组件之一,几乎每个Android应用中都会使用ListView。它以垂直列表的方式列出所需的列表项。
ListView的两个职责:
  • 将数据填充到布局;
  • 处理用户的选择点击等操作。
列表的显示需要三个元素:
  • 1.ListVeiw:用来展示列表的View;
  • 2.适配器: 用来把数据映射到ListView上的中介;
  • 3.数据源: 具体的将被映射的字符串,图片,或者基本组件。
什么是适配器?
适配器是一个连接数据和AdapterView的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便。将数据源的数据适配到ListView中的常用适配器有:ArrayAdapter、SimpleAdapter 和 SimpleCursorAdapter。
  • ArrayAdapter最为简单,只能展示一行字;
  • SimpleAdapter有最好的扩充性,可以自定义各种各样的布局,除了文本外,还可以放ImageView(图片)、Button(按钮)、CheckBox(复选框)等等;
  • SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。
  • 但是实际工作中,常用自定义适配器。即继承于BaseAdapter的自定义适配器类。
3、核心代码:

String[] strArr = new String[] { "yuhongxing", "sunshengling","chenyanzhang", "huangchao", "liupengfei" };
listView_main_userList = (ListView) findViewById(R.id.listView_main_userlist);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, strArr);
listView_main_userList.setAdapter(adapter);
SimpleAdapter 实现 多行文本 ListView:
(自定义item布局文件)

1、使用步骤。
(1)、定义一个集合来存放ListView中item的内容;
(2)、定义一个item的布局文件;
(3)、创建一个 SimpleAdapter 对象;
(3)、通过ListView的setAdapter()方法绑定 SimpleAdapter  。
2、核心代码:
publicclass MainActivity extends Activity {
privatestaticfinal String TAG = "MainActivity";
private ListView listView_main_news;
private List<Map<String, String>> list = null;

       @Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

listView_main_news = (ListView) findViewById(R.id.listView_main_news);

list = new ArrayList<Map<String, String>>();
for (int i = 0; i < 5; i++) {
Map<String, String> map = new HashMap<String, String>();
map.put("username", "wangxiangjun_" + i);
map.put("password", "123456_" + i);
list.add(map);
}Log.i(TAG, "==" + list.toString());
          // 定义SimpleAdapter适配器。          // 使用SimpleAdapter来作为ListView的适配器,比ArrayAdapter能展现更复杂的布局效果。为了显示较为复杂的ListView的item效果,需要写一个xml布局文件,来设置ListView中每一个item的格式。
SimpleAdapter adapter = new SimpleAdapter(this, list,
R.layout.item_listview_main, new String[] { "username",
"password" }, newint[] {
R.id.text_item_listview_username,
R.id.text_item_listview_pwd });

listView_main_news.setAdapter(adapter);
}

       @Override
publicboolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
returntrue;
}

}


(三)、SimpleAdapter实现多行文本且带 图片ListView:
1、使用步骤。
(1)、定义一个集合来存放ListView中item的内容;
(2)、定义一个item的布局文件;
(3)、创建一个 SimpleAdapter 对象;
(4)、通过ListView的setAdapter()方法绑定 SimpleAdapter  。

2、核心代码:
publicclass MainActivity extends Activity {
private ListView listView_main_regmsg;
privateint[] imgIds = newint[] { R.drawable.pic01, R.drawable.pic02,
R.drawable.pic03, R.drawable.pic04 };

       @Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

          listView_main_regmsg = (ListView) findViewById(R.id.listView_main_regmsg);

                // 创建数据源
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
for (int i = 0; i < imgIds.length; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("username", "wanglu_" + i);
map.put("pwd", "123456_" + i);
map.put("imgId", imgIds[i]);
list.add(map);
}

/* * 常用的SimpleAdapter的构造方法有五个参数:
 *
 * @param context :表示上下文对象或者环境对象。
 *
 * @param data :表示数据源。往往采用List<Map<String, Object>>集合对象。
 *
 * @param resource :自定义的ListView中每个item的布局文件。用R.layout.文件名的形式来调用。
 *
 * @param from :其实是数据源中Map的key组成的一个String数组。
 *
 * @param to :表示数据源中Map的value要放置在item中的哪个控件位置上。其实就是自定义的item布局文件中每个控件的id。
 * 通过R.id.id名字的形式来调用。
 */
SimpleAdapter adapter = new SimpleAdapter(this, list,
R.layout.item_listview_main, new String[] { "username", "pwd",
"imgId" }, newint[] {
R.id.text_item_listview_username,
R.id.text_item_listview_pwd,
R.id.imageView_item_listview_headpic });                // 给ListView设置适配器listView_main_regmsg.setAdapter(adapter);
}

       @Override
publicboolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
returntrue;
}

}

BaseAdapter自定义适配器实现ListView:
1、使用步骤。
(1)、定义一个集合来存放ListView中item的内容;
(2)、定义一个item的布局文件;
(3)、定义一个 继承了BaseAdapter的子类MyAdapter,重写未实现的方法;(定义 ViewHolder,重写 getView()方法)
(4)、创建一个内部类:MyAdapter extends BaseAdapter;
  • 实现未实现的方法:getCount() 、getItem()、 getItemId()、 getView();
  • 定义内部类ViewHolder,将item布局文件中的控件都定义成属性;
  • 构建一个布局填充器对象:LayoutInflater.from(context);
  • 调用布局填充器对象的inflate()方法填充item布局文件,将返回的view对象赋值给convertView;
  • 调用convertView对象的findViewById()获取item布局中的控件,将控件对象赋值给ViewHolder中的属性;
  • 给convertView对象设置标签,也就是调用setTag()方法,将ViewHolder对象作为标签贴在convertView对象上;
  • 从根据convertView的标签,从convertView对象上取回ViewHolder对象。
(3)、通过ListView的setAdapter()方法绑定自定义的MyAdapter对象 。

2、核心代码:

class MyAdapter extends BaseAdapter {private Context context = null;public MyAdapter(Context context) {this.context = context;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {return list.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder mHolder;if (convertView == null) {mHolder = new ViewHolder();LayoutInflater inflater = LayoutInflater.from(context);convertView = inflater.inflate(R.layout.item_listview_main_userlist, null, true);mHolder.text_item_listview_username = (TextView) convertView.findViewById(R.id.text_item_listview_username);mHolder.text_item_listview_email = (TextView) convertView.findViewById(R.id.text_item_listview_email);mHolder.imageView_item_listview_headpic = (ImageView) convertView.findViewById(R.id.imageView_item_listview_headpic);convertView.setTag(mHolder);} else {mHolder = (ViewHolder) convertView.getTag();}String username = list.get(position).get("username").toString();String email = list.get(position).get("email").toString();int picId = Integer.parseInt(list.get(position).get("headpic").toString());
          mHolder.text_item_listview_username.setText(username);mHolder.text_item_listview_email.setText(email);mHolder.imageView_item_listview_headpic.setImageResource(picId);return convertView;}class ViewHolder {private TextView text_item_listview_username;private TextView text_item_listview_email;private ImageView imageView_item_listview_headpic;}
}

什么是listview点击的 灵异事件?【 重要】
(一)、现象描述:
项目中的ListView不仅仅是简单的文字,常常需要自己定义ListView,如果自己定义的Item中存在诸如ImageButton,Button,CheckBox等子控件,此时这些子控件会将焦点获取到,所以当点击item中的子控件时有变化,而item本身的点击没有响应。
解决方案的关键是: android:descendantFocusability 
Defines the relationship between the ViewGroup and its descendants when looking for a View to take focus.
当一个view获取焦点时,定义ViewGroup及其子控件之间的关系。 
属性的值有三种:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:v iewgroup会覆盖子类控件而直接获得焦点
通常我们用到的是第三种,即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”
的属性( 阻塞子控件抢夺焦点,让Item具有焦点。 这样ListView的onItemClick就能被正确触发,同时item上的button等控件在被点击时照样可以触发自身的点击事件)就好了,至此ListView点击的灵异事件告一段落。

Android第八天相关推荐

  1. APP开发流程实例讲解-儒释道网络电台八天开发全程-在Android Studio中完成界面设计

    APP开发流程实例讲解-儒释道网络电台八天开发全程 功能和界面初步设定 APP开发流程实例讲解-儒释道网络电台八天开发全程 项目发起 功能和界面初步设定 在Android Studio中完成界面设计 ...

  2. Android核心基础第八天

    一.学习目标及要求 课程目标 课程内容(必须讲的内容,就是讲课的知识点的顺序) * 掌握从系统获取一张图片 * 掌握android下大图片处理 * 掌握画笔 画布 * 熟悉触摸事件 * 掌握图片旋转 ...

  3. android从放弃到精通 第八天 freedom

    8-3短信提醒-自定义短信弹框提醒 //0关于前面的短信提醒接收不到的问题,有一点需要牢记在心,android6.0以上版本的权限问题, ,至少在当前的情况下,在android8.0的虚拟机上解决相应 ...

  4. 3G手机Android应用开发视频教程_黎活明老师的视频(第三天课程)总共有八天课程...

    下载地址:http://jiyanet.com/read.php?tid=402 转载于:https://www.cnblogs.com/javaspring/archive/2012/08/21/2 ...

  5. 3G手机Android应用开发视频教程_黎活明老师的视频(第五天课程)总共有八天课程...

    下载地址:http://jiyanet.com/read.php?tid=404 转载于:https://www.cnblogs.com/javaspring/archive/2012/08/22/2 ...

  6. 3G手机Android应用开发视频教程_黎活明老师的视频下载地址(总共有八天课程)

    视频下载地址:http://jiyanet.com/read.php?tid=404

  7. 菜鸟要飞java_Java Android视频教程 下载

    安卓 |____14_Android源码级分析(day69)(更多视频教程关注微信公众号[菜鸟要飞]) |____Android源码级分析.7z |____13_百度地图(day68)(更多视频教程关 ...

  8. APP开发流程实例讲解-儒释道网络电台八天开发全程-百度云深度兼容测试并进一步优化排错

    APP开发流程实例讲解-儒释道网络电台八天开发全程之 百度云深度兼容测试并进一步优化排错 APP开发流程实例讲解-儒释道网络电台八天开发全程 项目发起 功能和界面初步设定 在Android Studi ...

  9. Alpha冲刺——第八天

    Alpha第八天 听说 031502543 周龙荣(队长) 031502615 李家鹏 031502632 伍晨薇 031502637 张柽 031502639 郑秦 1.前言 任务分配是VV.ZQ. ...

最新文章

  1. openlayers map获取全部feature_tf2.0基础-tf.data与tf.feature_column
  2. 无法安装到这个磁盘 这台计算机,安装Win7提示无法安装到这个磁盘怎么办
  3. Spring学习手册番外:context:annotation-config/ 和 mvc:annotation-driven / 的区别
  4. 【Python】0/1背包、动态规划
  5. 征战蓝桥 —— 2014年第五届 —— C/C++A组第9题——斐波那契
  6. 并发工具类纵览——建立起Java并发体系的大厦
  7. struts2:多业务方法的处理(动态调用,DMI)
  8. 如何使用 ABAP 手动解析 multipart/form-data 格式的数据
  9. 论计算机与智能科学类,计算机与智能科学大类培养方案
  10. UNIX标准化及实现之POSIX标准可选头文件
  11. 万万没想到,AI算法开发、OCR应用已经进入零门槛时代!
  12. python selenium框架_python+selenium之框架设计
  13. 毕啸南专栏 | 对话李开复:AI科学家的转型之路
  14. TFTP软件测试自学,tftp
  15. 数据库课程设计实验报告--图书馆管理系统
  16. 推荐一款源代码统计分析、开发工作量估算、测试缺陷预测的开发工具 —— 代码统计分析工具(SourceCounter)
  17. 虚拟机中Linux安装可视化界面
  18. java的web开发之旅——第1站html
  19. 成功人士成功秘诀的调查报告,拥有梦想至关重要
  20. java读取excel表格数据

热门文章

  1. 【KNN】使用KNN算法实现对iris数据集的分类
  2. 【Tomcat】tomcat logs 目录下各日志文件的含义
  3. UG NX 12 基准平面
  4. ArcGIS学习教程免费版在线观看
  5. comsol with matlab完整案例 sina,[转载]Comsol with Matlab 应用实例(2)
  6. 【小组专题一:数论入门:整数】数和序列 | 和与积 | 数学归纳与第二数学归纳
  7. Mac有什么好用的词典软件吗?苹果电脑第三方词典软件推荐
  8. TED x Brixton
  9. 计算机科学与技术杂谈
  10. 让代码优雅起来(学会调试+代码风格)