一、实验目的

(1)掌握ListView控件的使用

(2)掌握如何自定义Adapter的使用

二、实验内容

(1)定义一个实体类Fruit,作为ListView适配器的适配类型。

(2)为ListView的子项指定一个我们自定义的布局fruit_item.xml。

(3)创建一个自定义的适配器FruitAdapter,这个适配器继承自ArrayAdapter。重写构造方法和getView方法。

(4) 分析上述代码存在的问题并改进。

三、实验结果图

四、实验代码

Fruit类:

package com.test5.listview;public class Fruit
{private String name;private int id;public Fruit(String name,int id){// TODO Auto-generated constructor stubthis.id = id;this.name = name;}public int getId(){return id;}public String getName(){return name;}
}

FruitAdapter:

package com.test5.listview;import java.util.List;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;public class FruitAdapter extends ArrayAdapter<Fruit>
{private int resouceID;public FruitAdapter(Context context, int id, List<Fruit> objects){super(context, id, objects);// TODO Auto-generated constructor stubresouceID = id;}
@Overridepublic View getView(int position, View convertView, ViewGroup parent){// TODO Auto-generated method stubFruit fruit = getItem(position);View view;ViewHolder viewHolder;if (convertView == null) {view = LayoutInflater.from(getContext()).inflate(resouceID, null);viewHolder = new ViewHolder();viewHolder.fruit_image = (ImageView) view.findViewById (R.id.fruit_image);viewHolder.fruit_item = (TextView) view.findViewById (R.id.fruit_item);view.setTag(viewHolder); // 将ViewHolder存储在View中} else {view = convertView;viewHolder = (ViewHolder) view.getTag(); // 重新获取ViewHolder}viewHolder.fruit_image.setImageResource((fruit).getId());viewHolder.fruit_item.setText(fruit.getName());return view;}
}class ViewHolder{ImageView fruit_image;TextView fruit_item;
}

MainActivity:

package com.test5.listview;import java.util.ArrayList;
import java.util.List;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;public class MainActivity extends Activity
{private List<Fruit> fruitlist = new ArrayList<Fruit>();@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initFruit();FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitlist);ListView listview = (ListView) findViewById(R.id.lv);listview.setAdapter(adapter);listview.setOnItemClickListener(new OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position,long id){// TODO Auto-generated method stubFruit fruit = fruitlist.get(position);Toast.makeText(MainActivity.this, fruit.getName(), Toast.LENGTH_SHORT).show();      }});}@Overridepublic boolean onCreateOptionsMenu(Menu menu){// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}public void initFruit(){Fruit apple = new Fruit("Apple",R.drawable.apple_pic);fruitlist.add(apple);Fruit banana = new Fruit("Banana",R.drawable.banana_pic);fruitlist.add(banana);Fruit cherry = new Fruit("Cherry",R.drawable.cherry_pic);fruitlist.add(cherry);Fruit grape = new Fruit("Grape",R.drawable.grape_pic);fruitlist.add(grape);Fruit mango = new Fruit("Mango",R.drawable.mango_pic);fruitlist.add(mango);Fruit orange = new Fruit("Orange",R.drawable.orange_pic);fruitlist.add(orange);Fruit pear = new Fruit("Pear",R.drawable.pear_pic);fruitlist.add(pear);Fruit pineapple = new Fruit("Pineapple",R.drawable.pineapple_pic);fruitlist.add(pineapple);Fruit strawberry = new Fruit("Strawberry",R.drawable.strawberry_pic);fruitlist.add(strawberry);Fruit watermelon = new Fruit("Watermelon",R.drawable.watermelon_pic);fruitlist.add(watermelon);}
}

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity" ><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerHorizontal="true"android:layout_centerVertical="true" ></ListView></RelativeLayout>

fruit_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><ImageView android:id="@+id/fruit_image"android:layout_width="wrap_content"android:layout_height="wrap_content" /><TextView android:id="@+id/fruit_item"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginLeft="10dp"/></LinearLayout>

五、存在的问题

先回答实验内容中的第四条:按照图片的代码写的ListView的运行效率是很低的,因为在FruitAdapter的getView()方法中每次都将布局重新加载了一遍,当ListView快速滚动的时候这就会成为性能的瓶颈。所以我们需要做一点修改,在getView()方法中进行了判断,如果convertView为空,则使用LayoutInflater去加载布局,如果不为空则直接对convertView进行重用。新增了一个内部类ViewHolder,用于对控件的实例进行缓存。当convertView为空的时候,创建一个ViewHolder对象,并将控件的实例都存放在ViewHolder里,然后调用View的setTag()方法,将ViewHolder对象存储在View中。当convertView不为空的时候则调用View的getTag()方法,把ViewHolder重新取出。这样所有控件的实例都缓存在了ViewHolder里,就没有必要每次都通过findViewById()方法来获取控件实例了。

然后就是,上面都是参考书上的解释,大家能看明白最好,参考输上的MainActivity用的是线性布局,我这里用的的相对布局,显示不太有影响。

PS:前段时间忙着比赛没有时间更新,最近会一点点补上,实验课的内容在自学笔记中都会有讲解。

实验五 ListView 水果列表相关推荐

  1. 20175203 2018-2019 实验五《网络编程与安全》

    20175203 2018-2019 实验五<网络编程与安全> 知识重点(摘自实验资料) 栈 :(Stack)是一种只允许在表尾插入和删除的线性表,有先进后出(FILO),后进先出(LIF ...

  2. 山东大学linux应用实验五,【Linux】山东大学Linux应用课程实验记录

    找到这篇博文的人,一定被Linux实验弄得很爆炸吧哈哈哈. 这里是我Linux实验的记录,供大家学习和参考.如有错误,还请指正. 实验一 一. 基本命令 显示系统当前时间. date 显示2003年的 ...

  3. MOOS-ivp 实验五 MOOS编程进阶(3)

    MOOS-ivp 实验五 MOOS编程进阶(3) 经过近日的学习与摸索,我来重新完善以下实验五的相关内容,上次做到三分之二的内容放弃了,主要原因还是因为C++功底不够深厚,需要更多的学习和积累.经过我 ...

  4. MOOS-ivp 实验五 MOOS编程进阶(2)

    MOOS-ivp 实验五 MOOS编程进阶(2) 今天继续我的实验,感觉每个实验都要被卡住,这种感觉真的好难受,但是如果把问题成功的解决掉,又会给人以非常大的成就感.今天写这篇博客,希望我可以相对顺利 ...

  5. 数据可视化--实验五:高维非空间数据可视化

    声明:本文CSDN作者原创投稿文章,未经许可禁止任何形式的转载,原文链接 文章目录 概要 实验过程 Pyecharts 实验结果 平行坐标系 room1-6房间人员时长饼图 概要 学院:计算机科学与技 ...

  6. ENVI实验教程(5) 实验五、遥感图像增强

    实验五.遥感图像增强 一.实验目的 掌握空间域.辐射域.光谱域增强的原理与方法步骤: 掌握波段组合的原理与方法. 掌握ENVI直方图拉伸.空间卷积运算.光谱变换.波段运算和彩色合成等基本图像增强操作. ...

  7. 计算机网络实验毕业论文,计算机网络实验五.doc

    计算机网络实验五.doc 实验步骤: 练习一:察看TCP连接的建立和释放各主机打开协议分析器,进入相应的网络结构并验证网络拓扑的正确性,如果通过拓扑验证,关闭协议分析器继续进行实验,如果没有通过拓扑验 ...

  8. 信息安全 实验五、Windows安全策略

    实验五.Windows安全策略 文章目录 实验五.Windows安全策略 一.实验目的及要求 二.实验任务 三.实验内容 1.账号密码的安全原则有哪些?如何设置? (1)停掉Guest 帐号 (2) ...

  9. python实验目的_实验五 Python文件操作实验

    实验五 Python文件操作实验 一.实验目的与要求 1.掌握文件的打开和关闭. 2.掌握文件的不同操作,如读写.重命名.删除. 3.熟悉闭包.装饰器以及常见内置函数的使用. 二.实验原理 在pyth ...

最新文章

  1. Java Web项目配置环境搭建-如何增加Tomcat服务 Tomcat[内含Tomcat7资源]
  2. openstack登陆dashboard提示认证发生错误
  3. BI工具和数据中台有什么区别?数据中台初探
  4. 在CentOS上安装和配置Guacamole
  5. Netfilter 详解
  6. 算法笔记_面试题_22. 图与搜索(BFS/DFS)相关_模板及示例十几道
  7. 论文阅读笔记(十二)——U-Net: Convolutional Networks for Biomedical Image Segmentation
  8. Hitool工具烧写程序(按分区烧写)
  9. 中国矿业大学本科毕业设计Latex模板cumtthesis
  10. java 开根号函数_java程序中怎么调用平方根函数
  11. mysql数据库增加一行_向mysql数据库的座位表添加数据
  12. c语言aps审核,APS考官最讨厌的几类人
  13. 也许是史上最全的一次CDN详解
  14. c语言实现运输问题表上作业法,运输问题的表上作业法
  15. 国外安全网站、社区论坛、博客、公司、在线工具等整合收集
  16. Android AbsoluteLayout 绝对布局应用场景介绍
  17. 在win7上的eclipse向hadoop提交作业异常-权限/设置调度器
  18. Dreamweaver 8 建立网页实例
  19. 抢救站位图片_抢救配合流程和站位,看完单独值班也不怕了!
  20. Linux___压缩解压命令__11

热门文章

  1. Windows NPS搭建(NPS配置交换机radius认证登录)
  2. position的值, relative和absolute分别是相对于谁进行定位,你真的知道吗?
  3. 用c语言实现cos x 函数
  4. php之array的使用
  5. 基于AnimeGAN模型生成宫崎骏风格动漫照片
  6. swift MT报文处理相关资料
  7. CANOe系列讲解 - 搭建CANOe工程
  8. DB2 SQLSTATE 讯息(二)
  9. 关于JAVA中查询数据库时500错误Can not set int field ? to null value
  10. Windows系统下电脑强制卡死、关机的邪恶方法