简介:

  ListView是手机上最常用的控件之一,几乎所有的程序都会用到,手机屏幕空间有限,当需要显示大量数据的时候,就需要借助ListView来实现,允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时原有的数据将滚动出去。

一、使用准备好的data数组来显示ListView

  1. 新建项目,修改activity_main.xml中的代码,增加ListView控件,简单设置属性

     <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="com.example.listviewtest.MainActivity" > <ListView
    android:id="@+id/list_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    /> </RelativeLayout>
  2. 在主活动MainActivity.java中新建数据数组data,新建适配器,设置适配器显示
     package com.example.listviewtest;
    
     import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    public class MainActivity extends Activity { //建立私有数组来存储要显示的数据
    private String[] data = {"Apple","Banana","Orange","Watermelon","pear","Grape","Pineapple","Strawberry","Cherry","Mango"
    ,"Apple","Banana","Orange","Watermelon","pear","Grape","Pineapple","Strawberry","Cherry","Mango"}; @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); //新建适配器来转换数据
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,data); //实例化ListView
    ListView listView = (ListView) findViewById(R.id.list_view); //给listView设置适配器,将ListView和数据联系起来
    listView.setAdapter(adapter);
    } }

二、定制ListView的界面,可以设置图片等、更加美观

  1. 新建实体类,来存放要显示的数据,这里使用的水果列表

     package com.example.listviewtest;
    
     //存放水果信息的类
    public class Fruit {
    private String name ;//定义私有变量存储水果名称
    private int imageId ;//定义私有变量存储水果图片ID //定义构造方法来初始化
    public Fruit(String name , int imageId ) {
    // TODO Auto-generated method stub
    this.name = name;
    this.imageId = imageId;
    } //获取名称
    public String getName() {
    return name;
    }
    //获取图片ID
    public int getImageId()
    {
    return imageId;
    }
    }

    Fruit

  2. 为ListView的子项指定一个自定义布局fruit_item.xml,ImageView显示水果图片,TextView显示水果名称
     <?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"
    android:orientation="horizontal" > <ImageView
    android:id="@+id/fruit_image"
    android:layout_width="50sp"
    android:layout_height="50sp"/> <TextView
    android:id="@+id/fruit_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"居中显示 android:layout_marginLeft="10dip" 距离左侧10dip />
    </LinearLayout>
  3. 自定义适配器继承于ArrayAdapter,将泛型指定为Fruit类
     package com.example.listviewtest;
    
     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> {
    //定义地址路径 resourceId
    private int resourceId; //重写父类的构造方法,传入上下文,ListView子布局ID和数据传进来;
    public FruitAdapter(Context context,int textViewResource,List<Fruit> object) {
    // TODO Auto-generated constructor stub
    super(context , textViewResource , object);
    resourceId = textViewResource;
    } //重写getView方法,返回View
    @Override
    public View getView(int position, View convertView, ViewGroup parent) { //获取当前页面的Fruit实例,根据屏幕上的菜单滚动得到
    Fruit fruit = getItem(position); //使用Layoutinflater为这个子项加载我们传入的布局(resourceId),
    View view = LayoutInflater.from(getContext()).inflate(resourceId, null); //分别获取子布局中ImageView和TextView的实例
    ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
    TextView fruitName = (TextView) view.findViewById(R.id.fruit_name); //调用控件ImageView实例的setImageResource设置图片,TextView的setText方法设置文字;
    fruitImage.setImageResource(fruit.getImageId());
    fruitName.setText(fruit.getName()); //返回View
    return view; }
    }

    FruitAdapter类

  4. 重写MainActivity.java文件,
     package com.example.listviewtest;
    
     import java.util.ArrayList;
    import java.util.List;
    import com.example.listviewtest.Fruit;
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ListView;
    public class MainActivity extends Activity { //建立一个集合来存储实体类,实际上是水果的列表
    private List<Fruit> fruitList = new ArrayList<Fruit>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); //实例化ListView控件为listView
    ListView listView = (ListView) findViewById(R.id.list_view); //利用自定义方法初始化水果数据
    initFruits(); //实例化适配器FruitAdapter,传入上下文、子布局、水果列表
    FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList); //为listView设置适配器,联系ListView和数据
    listView.setAdapter(adapter);
    } //自定义方法初始化水果数据
    private void initFruits() { //实例化水果对象;
    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 orange = new Fruit("Orange",R.drawable.orange_pic);
    fruitList.add(orange);
    Fruit watermelon = new Fruit("Watermelon",R.drawable.watermelon_pic);
    fruitList.add(watermelon);
    Fruit pear = new Fruit("Pear",R.drawable.pear_pic);
    fruitList.add(pear);
    Fruit grape = new Fruit("Grape",R.drawable.grape_pic);
    fruitList.add(grape);
    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 cherry = new Fruit("Cherry", R.drawable.cherry_pic);
    fruitList.add(cherry);
    Fruit mango = new Fruit("Mango", R.drawable.mango_pic);
    fruitList.add(mango);
    } }

    MainActivity.java

  5. 显示效果(右键查看图像看大图):

三、提升ListView的运行效率,基于上面二中的例子

  主要解决的是:   1、在getView中每次都加载布局

          2、getView中每次都要实例化控件的实例

  1. 优化一:通过判断FruitAdapter中的getView方法中的convertView是否为空进行优化;(红色为修改部分)

     package com.example.listviewtest;
    
     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> {
    //定义地址路径 resourceId
    private int resourceId; //重写父类的构造方法,传入上下文,ListView子布局ID和数据传进来;
    public FruitAdapter(Context context,int textViewResource,List<Fruit> object) {
    // TODO Auto-generated constructor stub
    super(context , textViewResource , object);
    resourceId = textViewResource;
    } //重写getView方法,返回View
    @Override
    public View getView(int position, View convertView, ViewGroup parent) { //获取当前页面的Fruit实例,根据屏幕上的菜单滚动得到
    Fruit fruit = getItem(position); //新建View对象
    View view ;
    32
    33 //判断convertView对象是否为空,如果为空就重新加载;
    34 if(convertView == null)
    35 {
    36 //使用Layoutinflater为这个子项加载我们传入的布局(resourceId),
    37 view = LayoutInflater.from(getContext()).inflate(resourceId, null);
    38 }
    39 else//如果不为空,则重新调用convertView;不必重新加载
    40 {
    41 view = convertView;
    42 } //分别获取子布局中ImageView和TextView的实例
    ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
    TextView fruitName = (TextView) view.findViewById(R.id.fruit_name); //调用控件ImageView实例的setImageResource设置图片,TextView的setText方法设置文字;
    fruitImage.setImageResource(fruit.getImageId());
    fruitName.setText(fruit.getName()); //返回View
    return view; }
    }
  2. 优化二:借助ViewHolder来对获取控件实例进行优化,修改Fruit中的代码,(对比上面的优化一,红色为修改部分)
     package com.example.listviewtest;
    
     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> {
    //定义地址路径 resourceId
    private int resourceId; //重写父类的构造方法,传入上下文,ListView子布局ID和数据传进来;
    public FruitAdapter(Context context,int textViewResource,List<Fruit> object) {
    // TODO Auto-generated constructor stub
    super(context , textViewResource , object);
    resourceId = textViewResource;
    } //重写getView方法,返回View
    @Override
    public View getView(int position, View convertView, ViewGroup parent) { //获取当前页面的Fruit实例,根据屏幕上的菜单滚动得到
    Fruit fruit = getItem(position); //新建View对象
    View view ; //声明
    34 ViewHolder viewHolder; //判断convertView对象是否为空,如果为空就重新加载;
    if(convertView == null)
    {
    //使用Layoutinflater为这个子项加载我们传入的布局(resourceId),
    view = LayoutInflater.from(getContext()).inflate(resourceId, null);
    //实例化一个ViewHolder
    viewHolder = new ViewHolder();
    43 //将控件的实例都存在ViewHolder中
    44 viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
    45 viewHolder.fruitname = (TextView) view.findViewById(R.id.fruit_name);
    46 //吧ViewHolder存储在View中;
    47 view.setTag(viewHolder);
    }
    else//如果不为空,则重新调用convertView;不必重新加载
    {
    view = convertView;
    //重新获取ViewHolder
    viewHolder = (ViewHolder) view.getTag();
    } //分别获取子布局中ImageView和TextView的实例
    // ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
    // TextView fruitName = (TextView) view.findViewById(R.id.fruit_name); //调用控件ImageView实例的setImageResource设置图片,TextView的setText方法设置文字;
    // fruitImage.setImageResource(fruit.getImageId());
    // fruitName.setText(fruit.getName()); //在ViewHolder中完成设置
    65 viewHolder.fruitImage.setImageResource(fruit.getImageId());
    66 viewHolder.fruitname.setText(fruit.getName()); //返回View
    return view; }
    }
    class ViewHolder {
    ImageView fruitImage;
    TextView fruitname;
    }

总结:通过上面两部的优化,已经很大程度上提高了ListView的运行效率了;

最终效果图:

追加:为ListView设置点击事件;

  在MainActivity中加入ListView的监听事件

 listView.setOnItemClickListener(new OnItemClickListener() {

             @Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) { //获取当前点击的Fruit对象
Fruit fruit = fruitList.get(position); //利用Toast提示点击事件
Toast.makeText(MainActivity.this, "You Clicked The"+fruit.getName(), Toast.LENGTH_SHORT).show();
} });

效果图:

【实战】初识ListView及提高效率的更多相关文章

  1. Hadoop实战:使用Combiner提高Map/Reduce程序效率

    好不easy算法搞定了.小数据測试也得到了非常好的结果,但是扔到进群上.挂上大数据就挂了.无休止的reduce不会结束了. .. .. .... .. ... .. ================= ...

  2. Android零基础入门第37节:初识ListView

    原文:Android零基础入门第37节:初识ListView 之前我们学习的一些UI组件都比较简单,但是在实际开发中,会经常遇见列表界面设计,如通讯录.电话列表.信息列表等.那么从本节开始来详细学习列 ...

  3. Oracle多表连接,提高效率,性能优化 (转)

    执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单表数据的统计比多表统计的速度完全是两个概念.单表统计可能只要0.02秒,但是2张表联合统计就可能要几十表了. ...

  4. 提高效率的Matlab使用方式

    1.花一点时间学习一些提高效率的技巧永远是值得的: 2.总结和记录永远是必要的. Command窗口: Editor窗口: 1.Tab自动补全

  5. paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较

    paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较 ##java ----------- 在JDK1.7中,摒弃了Java集合接口的实现类,如:Ar ...

  6. paip.提高效率---微信 手机app快速开发平台—微网络撬动大市场

    paip.提高效率---微信 手机app快速开发平台-微网络撬动大市场   手机app快速开发平台 尤其适合crm系统,呼叫中心等业务功能...    作者Attilax  艾龙,  EMAIL:14 ...

  7. oracle里要查看一条sql的执行情况,有没有走到索引,怎么看?索引不能提高效率?

    index scan 索引扫描 full table scan是全表扫描 直接explain plan for 还有个set autotrace什么 索引一定能提高执行效率吗? 索引不能提高效率的情况 ...

  8. HttpWebRequest提高效率之连接数,代理,自动跳转,gzip请求等设置问题

    先设置4个: [csharp] webrequest.ServicePoint.Expect100Continue = false; //是否使用 Nagle 不使用 提高效率 webrequest. ...

  9. 计算机天才Aaron Swartz 名作 《如何提高效率》——纪念真正的“hacker"!

    如何提高效率 <HOWTO: Be more productive>(如何提高效率)作者:Aaron Swartz 肯定有人跟你说过这样的话,“你有看电视的那么长时间,都可以用来写一本书了 ...

随机推荐

  1. Python基础篇【第2篇】: Python自定义函数

    Python函数 1. 函数定义 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print ...

  2. Android Studio JNI/NDK 编程(二) Windows 下环境搭建 demo 开发

    环境 windows 8  (注:其实 Linux 开发可能更方便) Android Studio 2.1; 一 . 下载 安装android-ndk开发包 地址:链接:http://pan.baid ...

  3. maven 打包 spring 项目

    在程序中使用到了springframework控件(主要是为了使用Mybatis-spring操作数据库,省事). 使用maven管理项目的构建,现在需要生成一个jar包,包含所有依赖的jar包,并可 ...

  4. Java基础以及与C++的一些对比

    这两天回忆一些Java基础,感觉自己很多地方都不是很牢固,也花费在不少时间和不少流量在手机上查资料. 还是写下来这些东西以免再忘记. 同时还是要记住多动手,编程最重要的就是动手敲啊,有想法有疑问就要自 ...

  5. Fastcgi介绍和php中fastcgi的应用

    先看下FastCgi的一些解释: CGI全称是“通用网关接口”(Common Gateway Interface), 它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据. CGI描述 ...

  6. 2016年 Delphi Roadmap

    2016年delphi Roadmap 发布,这也是新公司的第一次发布路线图. 虽然稍微晚点( 原来说是1月份发布路线图),至少比过去积极点.喧嚣多年的靴子终于落地. Linux 的支持终于正式公布. ...

  7. 8.4 H5知识点总结

    HTML简介 HyperText Markup Language 简称为HTML HyperText: 超文本 (文本 + 图片 + 视频 + 音频 + 链接) Markup Language: 标记 ...

  8. 三天没有写题了,罪过!--Hash Table Start

    (1)Island Perimeter 解题思路: 在矩阵上循环并记录岛(1)的个数;如果当前节点是岛,则检查其是否具有任何右邻居或下邻居,有的话邻居计数加1 ;岛的周长结果为islands * 4 ...

  9. ORACLE恢复数据

    ORACLE恢复删除表或表记录 一:表的恢复      对误删的表,只要没有使用PURGE永久删除选项,那么从flash back区恢复回来希望是挺大的.一般步骤有: 1.从flash back里查询 ...

  10. Tomcat启动过程中找不到JAVA_HOME解决方法

    在XP上明明已经安装了JDK1.5并设置好了JAVA_HOME,可偏偏Tomcat在启动过程中找不到. 报错信息如下:Neither the JAVA_HOME nor the JRE_HOME en ...