ListView在android开放中用的比较多,所以接下来就进行ListView的使用的讲解。

首先创建一个android项目,项目名为ListViewTest.

ListView的简单使用

修改布局文件,修改后代码如下:

[html] view plaincopyprint?
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. >
  6. <ListView
  7. android:id="@+id/list_view"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. ></ListView>
  11. </LinearLayout>

修改MainActivity的代码:

[java] view plaincopyprint?
  1. package com.wj.listviewtest;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.Menu;
  5. import android.widget.ArrayAdapter;
  6. import android.widget.ListView;
  7. public class MainActivity extends Activity {
  8. private String [] data={"apple","banana","orange",
  9. "watermelon","pear","grape","pineapple","strawberry",
  10. "cherry","mango"};
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_main);
  15. //创建适配器
  16. ArrayAdapter<String> adapter=new ArrayAdapter<String>(
  17. MainActivity.this,android.R.layout.simple_list_item_1,
  18. data);
  19. ListView listView=(ListView) findViewById(R.id.list_view);
  20. listView.setAdapter(adapter);
  21. }
  22. @Override
  23. public boolean onCreateOptionsMenu(Menu menu) {
  24. // Inflate the menu; this adds items to the action bar if it is present.
  25. getMenuInflater().inflate(R.menu.main, menu);
  26. return true;
  27. }
  28. }

运行程序结果如下:

ListView是用于显示大量数据的,这些数据我们可以事先准备好,也可以从网上或者数据中中读取。

android.R.layout.simple_list_item_1是作为ListView子项布局的id,这是android内置的布局文件里面只有一个TextView,可用于简单地显示一段文本。

2.定制ListView的界面

首先准备一组图片,分别对应上面提供的水果。

接着定义一个实体类,作为ListView适配器的适配类型,新建Fruit类,代码如下:

[java] view plaincopyprint?
  1. package com.wj.listviewtest;
  2. public class Fruit {
  3. private String name;//水果名
  4. private int imageId;//水果图片的资源id
  5. //无参构造函数
  6. public Fruit(){}
  7. //有参构造函数
  8. public Fruit(String name,int imageId){
  9. this.name=name;
  10. this.imageId=imageId;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public int getImageId() {
  19. return imageId;
  20. }
  21. public void setImageId(int imageId) {
  22. this.imageId = imageId;
  23. }
  24. }

Fruit类中只有2个字段,name表示水果的名字,imageId表示水果对应图片的资源id,然后需要为ListView的子项指定一个我们自定义的布局,在layout目录下面新建fruit_item.xml代码如下:

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. >
  6. <ImageView
  7. android:id="@+id/fruit_image"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. />
  11. <TextView
  12. android:id="@+id/fruit_name"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:layout_gravity="center"
  16. android:layout_marginLeft="10dip"
  17. />
  18. </LinearLayout>

这个布局中我们定义了一个ImageView用于显示水果的图片,又定义了一个TextView用于显示水果的名称。

接着我们要创建一个自定义的适配器,这个适配器继承自ArrayAdapter,并将泛型指定为Fruit。新建一个类FruitAdapter代码如下:

[java] view plaincopyprint?
  1. package com.wj.listviewtest;
  2. import java.util.List;
  3. import android.content.Context;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.ArrayAdapter;
  8. import android.widget.ImageView;
  9. import android.widget.TextView;
  10. public class FruitAdapter extends ArrayAdapter<Fruit> {
  11. private int resourceId;
  12. public FruitAdapter(Context context, int textViewResourceId,
  13. List<Fruit> objects) {
  14. super(context, textViewResourceId, objects);
  15. // TODO Auto-generated constructor stub
  16. /*
  17. * 重写了父类的构造函数,用于将上下文,ListView子项布局的id和数据都传进来。
  18. * */
  19. resourceId=textViewResourceId;
  20. }
  21. @Override
  22. public View getView(int position, View convertView, ViewGroup parent) {
  23. // TODO Auto-generated method stub
  24. //return super.getView(position, convertView, parent);
  25. /*
  26. * 重写getView方法,这个方法在每个子项被滚动到屏幕内的时候会被调用,在getView方法中
  27. * ,首先通过getItem方法得到当前项的Fruit实例,然后使用LayoutInflater来为这个子项加载
  28. * 我们传入的布局,接着调用View的findViewById方法分别获取到ImageView和TextView的实例,
  29. * 并分别调用他们的setImageResource和setText方法来设置显示的图片和文字,最后返回布局
  30. * */
  31. Fruit fruit=getItem(position);//获取当前项的Fruit实例
  32. //初始话ListView的子项布局
  33. View view=LayoutInflater.from(getContext()).inflate(resourceId, null);
  34. ImageView fruitImage=(ImageView) view.findViewById(R.id.fruit_image);
  35. TextView fruitName=(TextView) view.findViewById(R.id.fruit_name);
  36. fruitImage.setImageResource(fruit.getImageId());
  37. fruitName.setText(fruit.getName());
  38. return view;
  39. }
  40. }

修改MainActivity的代码如下:

[java] view plaincopyprint?
  1. package com.wj.listviewtest;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.view.Menu;
  7. import android.widget.ArrayAdapter;
  8. import android.widget.ListView;
  9. public class MainActivity extends Activity {
  10. /*private String [] data={"apple","banana","orange",
  11. "watermelon","pear","grape","pineapple","strawberry",
  12. "cherry","mango"};*/
  13. private List<Fruit> fruitList=new ArrayList<Fruit>();
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. /*//创建适配器
  19. ArrayAdapter<String> adapter=new ArrayAdapter<String>(
  20. MainActivity.this,android.R.layout.simple_list_item_1,
  21. data);
  22. ListView listView=(ListView) findViewById(R.id.list_view);
  23. listView.setAdapter(adapter);*/
  24. initFruits();//初始化水果
  25. FruitAdapter adapter=new FruitAdapter(MainActivity.this,
  26. R.layout.fruit_item, fruitList);
  27. ListView listView=(ListView) findViewById(R.id.list_view);
  28. //设置适配器
  29. listView.setAdapter(adapter);
  30. }
  31. @Override
  32. public boolean onCreateOptionsMenu(Menu menu) {
  33. // Inflate the menu; this adds items to the action bar if it is present.
  34. getMenuInflater().inflate(R.menu.main, menu);
  35. return true;
  36. }
  37. public void initFruits(){
  38. Fruit apple=new Fruit("apple",R.drawable.apple_pic);
  39. fruitList.add(apple);
  40. Fruit banana=new Fruit("banana",R.drawable.banana_pic);
  41. fruitList.add(banana);
  42. Fruit orange=new Fruit("orange",R.drawable.orange_pic);
  43. fruitList.add(orange);
  44. Fruit watermelon=new Fruit("watermelon",R.drawable.watermelon_pic);
  45. fruitList.add(watermelon);
  46. Fruit pear=new Fruit("pear",R.drawable.pear_pic);
  47. fruitList.add(pear);
  48. Fruit grape=new Fruit("grape",R.drawable.grape_pic);
  49. fruitList.add(grape);
  50. Fruit pineapple=new Fruit("pineapple",R.drawable.pineapple_pic);
  51. fruitList.add(pineapple);
  52. Fruit strawberry=new Fruit("strawberry",R.drawable.strawberry_pic);
  53. fruitList.add(strawberry);
  54. Fruit cherry=new Fruit("cherry",R.drawable.cherry_pic);
  55. fruitList.add(cherry);
  56. Fruit mango=new Fruit("mango",R.drawable.mango_pic);
  57. fruitList.add(mango);
  58. }
  59. }

运行程序,结果如下:

这是一个简单的界面,不过更加复杂的界面也可以通过修改fruit_item.xml文件来实现更加复杂的ListView。

下面我们来提示下ListView的运行效率。

目前我们的ListView的运行效率是很低的,因为在FruitAdapter的getView方法中每次都要将布局重写加载了一遍,当ListView快速滚动的时候这就会成为性能的瓶颈。仔细观察,getView方法中还有一个convertView参数,这个参数用于将之前加载好的布局进行缓存,以便之后可以进行重用,修改FruitAdapter中的代码,带入如下所示:

[java] view plaincopyprint?
  1. @Override
  2. public View getView(int position, View convertView, ViewGroup parent) {
  3. // TODO Auto-generated method stub
  4. //return super.getView(position, convertView, parent);
  5. /*
  6. * 重写getView方法,这个方法在每个子项被滚动到屏幕内的时候会被调用,在getView方法中
  7. * ,首先通过getItem方法得到当前项的Fruit实例,然后使用LayoutInflater来为这个子项加载
  8. * 我们传入的布局,接着调用View的findViewById方法分别获取到ImageView和TextView的实例,
  9. * 并分别调用他们的setImageResource和setText方法来设置显示的图片和文字,最后返回布局
  10. * */
  11. Fruit fruit=getItem(position);//获取当前项的Fruit实例
  12. View view;
  13. /*
  14. * 在getView()方法中进行判断,如果convertView为空,则使用LayoutInflater去加载布局,
  15. * 如果不为空,则直接对convertView进行重用。这样可以大大提升ListView的效率,在快速滚动的时候
  16. * 也可以表现更好的性能。
  17. * */
  18. if(convertView==null){
  19. //初始话ListView的子项布局
  20. view=LayoutInflater.from(getContext()).inflate(resourceId, null);
  21. }else{
  22. view=convertView;
  23. }
  24. /*//初始话ListView的子项布局
  25. View view=LayoutInflater.from(getContext()).inflate(resourceId, null);*/
  26. ImageView fruitImage=(ImageView) view.findViewById(R.id.fruit_image);
  27. TextView fruitName=(TextView) view.findViewById(R.id.fruit_name);
  28. fruitImage.setImageResource(fruit.getImageId());
  29. fruitName.setText(fruit.getName());
  30. return view;
  31. }

上面的代码进行了部分的优化,虽然现在已经不用在重复的去加载布局了,但是每次在getView方法中还是会调用View的view.findViewById()方法来获取一次控件的实例。我们可以借助一个ViewHolder来对这部分性能进行优化,修改FruitAdapter中的代码,如下所示:

[java] view plaincopyprint?
  1. package com.wj.listviewtest;
  2. import java.util.List;
  3. import android.content.Context;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.ArrayAdapter;
  8. import android.widget.ImageView;
  9. import android.widget.TextView;
  10. public class FruitAdapter extends ArrayAdapter<Fruit> {
  11. private int resourceId;
  12. public FruitAdapter(Context context, int textViewResourceId,
  13. List<Fruit> objects) {
  14. super(context, textViewResourceId, objects);
  15. // TODO Auto-generated constructor stub
  16. /*
  17. * 重写了父类的构造函数,用于将上下文,ListView子项布局的id和数据都传进来。
  18. * */
  19. resourceId=textViewResourceId;
  20. }
  21. @Override
  22. public View getView(int position, View convertView, ViewGroup parent) {
  23. // TODO Auto-generated method stub
  24. //return super.getView(position, convertView, parent);
  25. /*
  26. * 重写getView方法,这个方法在每个子项被滚动到屏幕内的时候会被调用,在getView方法中
  27. * ,首先通过getItem方法得到当前项的Fruit实例,然后使用LayoutInflater来为这个子项加载
  28. * 我们传入的布局,接着调用View的findViewById方法分别获取到ImageView和TextView的实例,
  29. * 并分别调用他们的setImageResource和setText方法来设置显示的图片和文字,最后返回布局
  30. * */
  31. Fruit fruit=getItem(position);//获取当前项的Fruit实例
  32. View view;
  33. ViewHolder viewHolder;
  34. /*
  35. * 在getView()方法中进行判断,如果convertView为空,则使用LayoutInflater去加载布局,
  36. * 如果不为空,则直接对convertView进行重用。这样可以大大提升ListView的效率,在快速滚动的时候
  37. * 也可以表现更好的性能。
  38. * */
  39. if(convertView==null){
  40. //初始话ListView的子项布局
  41. view=LayoutInflater.from(getContext()).inflate(resourceId, null);
  42. viewHolder=new ViewHolder();
  43. viewHolder.fruitImage=(ImageView) view.findViewById(R.id.fruit_image);
  44. viewHolder.fruitName=(TextView) view.findViewById(R.id.fruit_name);
  45. view.setTag(viewHolder);//将ViewHolder存储在View中
  46. }else{
  47. view=convertView;
  48. viewHolder=(ViewHolder) view.getTag();//重新获取ViewHolder
  49. }
  50. /*//初始话ListView的子项布局
  51. View view=LayoutInflater.from(getContext()).inflate(resourceId, null);*/
  52. /*ImageView fruitImage=(ImageView) view.findViewById(R.id.fruit_image);
  53. TextView fruitName=(TextView) view.findViewById(R.id.fruit_name);*/
  54. viewHolder.fruitImage.setImageResource(fruit.getImageId());
  55. viewHolder.fruitName.setText(fruit.getName());
  56. return view;
  57. }
  58. class ViewHolder{
  59. ImageView fruitImage;
  60. TextView  fruitName;
  61. }
  62. }

通过上面两步优化后,ListView的运行效率已经不错了。

ListView的点击事件

修改代码如下:

[java] view plaincopyprint?
  1. package com.wj.listviewtest;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import android.app.Activity;
  5. import android.os.Bundle;
  6. import android.view.Menu;
  7. import android.view.View;
  8. import android.widget.AdapterView;
  9. import android.widget.AdapterView.OnItemClickListener;
  10. import android.widget.ArrayAdapter;
  11. import android.widget.ListView;
  12. import android.widget.Toast;
  13. public class MainActivity extends Activity {
  14. /*private String [] data={"apple","banana","orange",
  15. "watermelon","pear","grape","pineapple","strawberry",
  16. "cherry","mango"};*/
  17. private List<Fruit> fruitList=new ArrayList<Fruit>();
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. /*//创建适配器
  23. ArrayAdapter<String> adapter=new ArrayAdapter<String>(
  24. MainActivity.this,android.R.layout.simple_list_item_1,
  25. data);
  26. ListView listView=(ListView) findViewById(R.id.list_view);
  27. listView.setAdapter(adapter);*/
  28. initFruits();//初始化水果
  29. FruitAdapter adapter=new FruitAdapter(MainActivity.this,
  30. R.layout.fruit_item, fruitList);
  31. ListView listView=(ListView) findViewById(R.id.list_view);
  32. //设置适配器
  33. listView.setAdapter(adapter);
  34. /*
  35. * setOnItemClickListener()方法来为ListView注册一个监听器,当用户点击了ListView
  36. * 中的任何一个子项时就会回调nItemClick()方法,在这个方法中可以通过position参数判断出用户点击
  37. * 的是哪一个子项,然后获取相应的水果,并通过Toast将水果的名字显示出来。
  38. * */
  39. listView.setOnItemClickListener(new OnItemClickListener(){
  40. @Override
  41. public void onItemClick(AdapterView<?> parent, View view, int position,
  42. long id) {
  43. // TODO Auto-generated method stub
  44. Fruit fruit=fruitList.get(position);
  45. Toast.makeText(MainActivity.this,
  46. fruit.getName(), Toast.LENGTH_SHORT).show();
  47. }
  48. });
  49. }
  50. @Override
  51. public boolean onCreateOptionsMenu(Menu menu) {
  52. // Inflate the menu; this adds items to the action bar if it is present.
  53. getMenuInflater().inflate(R.menu.main, menu);
  54. return true;
  55. }
  56. public void initFruits(){
  57. Fruit apple=new Fruit("apple",R.drawable.apple_pic);
  58. fruitList.add(apple);
  59. Fruit banana=new Fruit("banana",R.drawable.banana_pic);
  60. fruitList.add(banana);
  61. Fruit orange=new Fruit("orange",R.drawable.orange_pic);
  62. fruitList.add(orange);
  63. Fruit watermelon=new Fruit("watermelon",R.drawable.watermelon_pic);
  64. fruitList.add(watermelon);
  65. Fruit pear=new Fruit("pear",R.drawable.pear_pic);
  66. fruitList.add(pear);
  67. Fruit grape=new Fruit("grape",R.drawable.grape_pic);
  68. fruitList.add(grape);
  69. Fruit pineapple=new Fruit("pineapple",R.drawable.pineapple_pic);
  70. fruitList.add(pineapple);
  71. Fruit strawberry=new Fruit("strawberry",R.drawable.strawberry_pic);
  72. fruitList.add(strawberry);
  73. Fruit cherry=new Fruit("cherry",R.drawable.cherry_pic);
  74. fruitList.add(cherry);
  75. Fruit mango=new Fruit("mango",R.drawable.mango_pic);
  76. fruitList.add(mango);
  77. }
  78. }
  79. 本文转载自 http://blog.csdn.net/j903829182/article/details/40683293

ListView的高级使用相关推荐

  1. 【Flutter】ListView 列表高级功能 ( ScrollController 上拉加载更多 )

    文章目录 一.ScrollController 上拉加载更多 二.ScrollController 使用流程 三.ScrollController 判定滑动到底部 四.完整代码示例 五.相关资源 一. ...

  2. 【Flutter】ListView 列表高级功能 ( RefreshIndicator 下拉刷新组件 )

    文章目录 一.下拉刷新组件 二.下拉刷新代码示例 三.相关资源 一.下拉刷新组件 使用 Flutter 提供的 RefreshIndicator 组件 , 可以实现下拉刷新的功能 ; 使用 Refre ...

  3. ListView 和 RecyclerView 的使用

    ListView的讲解 ListView详细介绍与使用 前言介绍: 关于 ListView 我们大家都应该是非常的熟悉了,在 Android 开发中是经常用到的,今天就再来回顾一下,ListView ...

  4. qml的ListView控件添加ScrollBar

    下文提供了2种ListView控件和ScrollBar混合使用的方法: QML中ListView的高级使用之增加ScrollBar以及设置ScrollBar的样式_Joven_xxx的博客-CSDN博 ...

  5. RecycleView简介及基本使用

    ##RecycleView简介 RecyclerView控件和ListView的原理有很多相似的地方,都是维护少量的View来进行显示大量的数据,不过RecyclerView控件比ListView更加 ...

  6. Android面试问答

    上次更新时间:2019年1月4日 我们的Android面试问答集全部涉及可在面试中使用的不同类型的问题,以便雇主测试您的技能和知识. 在以下各节中,我们将讨论有关Android OS的功能,命令行工具 ...

  7. RecyclerView完全解析,让你从此爱上它(二十八)

    RecyclerView完全解析,让你从此爱上它(二十八) 2015-11-20      0 个评论   来源: 专注移动开发,项目管理.jiangqqlmj   收藏   我要投稿 (一).前言: ...

  8. Android:RecyclerView简单理解和基本使用

    RecyclerView RecyclerView 一.RecyclerView 二.RecyclerView基本介绍: 三.RecyclerView基本实现: 参考 RecyclerView 一.R ...

  9. RecyclerView 使用 和简单demo

    先看一下效果,随便从网上找的数据,首先看一下效果 ,随便从网上找的数据 经过简单配置可实现三种不同的配置   很简单 第一种 水平List 第二种  垂直List 第三种  GridVIew 显示 4 ...

最新文章

  1. 《大话设计模式》勘误
  2. 启明云端分享| 在应用启明云端sigmastar SSD201 / SSD202D核心板时,ISP烧录uboot遇到问题怎么解决呢
  3. VTK:高亮选择动画用法实战
  4. ubuntu搭建nodejs生产环境——快速部署手册
  5. php weize_docs.html
  6. 这就是数据分析之算法认知
  7. SpringCloud 微服务 (十五) 服务容错 Hystrix
  8. java传递引用参数
  9. 关于DYNPRO程序的系统迁移与版本不匹配问题之一
  10. Atitit. Derby的使用总结attilax
  11. hutool压缩文件
  12. slideUp()方法和slideDown()方法
  13. Ubuntu软件安装卸载
  14. 《金融科技(FinTech)发展规划(2019-2021年)》梳理
  15. NeurIPS 2022 | PEMN:参数集约型掩码网络
  16. 【Ubuntu】远程软件安装与卸载
  17. 经典加密算法的实现与破解大素数生成算法
  18. java mongo replica_mongo 的replica set的集群模式 实现读写分离
  19. MySQL数据库学习(二)
  20. 31、什么是 BIO?

热门文章

  1. RDKit:化合物骨架分析
  2. 基于概率论的生成式建模新模式
  3. 华为充电器接口叫什么_插座USB接口跟手机充电器有什么不同_电工百科
  4. Microbiome:Kraken2进行16S物种注释又快又准
  5. Nature: 人的肠道古细菌基因组集
  6. 高级转录组调控分析和R语言数据可视化第十三期 (线上线下,7月底开课)
  7. Microbiome:南土所梁玉婷组-稻田土壤产甲烷菌的共存模式
  8. Nature灵魂拷问:微生物组数据一大堆,如何能改变人类健康?
  9. Seaborn可视化使用relplot函数可视化数据长度不同的时间序列实战:two Pandas Series of different lengths
  10. 数据库中的字段varchar类型和char类型的区别?