public class

ListView

extends AbsListView

java.lang.Object
   ↳ android.view.View
     ↳ android.view.ViewGroup
       ↳ android.widget.AdapterView<T extends android.widget.Adapter>
         ↳ android.widget.AbsListView
           ↳ android.widget.ListView

Class Overview

A view that shows items in a vertically scrolling list. The items come from theListAdapter associated with this view.

public class

ArrayAdapter

extends BaseAdapter
implements Filterable

java.lang.Object
   ↳ android.widget.BaseAdapter
     ↳ android.widget.ArrayAdapter<T>

Class Overview

A concrete BaseAdapter that is backed by an array of arbitrary objects. By default this class expects that the provided resource id references a single TextView. If you want to use a more complex layout, use the constructors that also takes a field id. That field id should reference a TextView in the larger layout resource.

However the TextView is referenced, it will be filled with the toString() of each object in the array. You can add lists or arrays of custom objects. Override the toString() method of your objects to determine what text will be displayed for the item in the list.

To use something other than TextViews for the array display, for instance, ImageViews, or to have some of data besides toString() results fill the views, overridegetView(int, View, ViewGroup) to return the type of view you want.

1、ListView的简单使用

Demo:

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="sunny.example.listviewsimple.MainActivity" ><ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="match_parent"/></RelativeLayout>

MainActivity.java

package sunny.example.listviewsimple;import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;public class MainActivity extends ActionBarActivity {private String[] data = {"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry","Mango"};@Overrideprotected 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)findViewById(R.id.list_view);listView.setAdapter(adapter);}
}

2、提升ListView的运行效率ViewHolder、自定义ListView的界面(例:包括一个ImageView和一个TextView)

上例一个item只能显示一段文本,现在自定义一个ListView的界面。自定义一个Fruit类,作为ListView适配器的适配类型。

Fruit.java

package com.example.listviewtest;public class Fruit {private String name;private int imageId;public Fruit(String name,int imageId){this.name = name;this.imageId = imageId;}public String getName(){return name;}public int getImageId(){return imageId;}}

Fruit类有两个字段,name表示水果的名字,iamgeId表示水果对应的图片资源id。

然后为ListView的item自定义一个布局

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"><ImageViewandroid:id="@+id/fruit_image"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/fruit_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginLeft="10dip"/>
</LinearLayout>
子item布局中定义一个ImageView用于显示水果图片,TextView用于显示水果名字。
创建一个自定义适配器FruitAdapter继承自ArrayAdapter,将泛型指定为Fruit类。
 
FruitAdapter中用到的类与方法:
public abstract class

LayoutInflater

extends Object

java.lang.Object
   ↳ android.view.LayoutInflater

Class Overview

Instantiates a layout XML file into its corresponding View objects. It is never used directly. Instead, usegetLayoutInflater() orgetSystemService(String) to retrieve a standard LayoutInflater instance that is already hooked up to the current context and correctly configured for the device you are running on. For example:

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

public static LayoutInflater from (Context context)

Added in API level 1

Obtains the LayoutInflater from the given context.

public View inflate (int resource,ViewGroup root)

Added in API level 1

Inflate a new view hierarchy from the specified xml resource. Throws InflateException if there is an error.

Parameters
resource ID for an XML layout resource to load (e.g., R.layout.main_page)
root Optional view to be the parent of the generated hierarchy.
Returns
  • The root View of the inflated hierarchy. If root was supplied, this is the root View; otherwise it is the root of the inflated XML file.

 
FruitAdapter.java
public class FruitAdapter extends ArrayAdapter<Fruit> {private int resourceId;public  FruitAdapter(Context context,int textViewResourceId,List<Fruit> objects){super(context,textViewResourceId,objects);resourceId = textViewResourceId;}@Overridepublic View getView(int position,View convertView,ViewGroup parent){//得到当前项的Fruit实例Fruit fruit = getItem(position);//LayoutInflater来为这个子项加载布局View view = LayoutInflater.from(getContext()).inflate(resourceId,null);ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);TextView textView = (TextView) view.findViewById(R.id.fruit_name);fruitImage.setImageResource(fruit.getImageId());fruitName.setText(fruit.getName());return view;}
}
重写了ArrayAdapter的 getView()方法,这个方法在每个子item被滚动到屏幕内的时候会被调用。

目前ListView的运行效率是很低的,因为每个子item被滚动到屏幕内的时候会调用getView(),在getView()方法中每次都将布局加载了一遍。

优化方法一:

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

方法中有一个convertView参数,用于将之前加载好的布局进行缓存,以便以后重用。

修改上述代码:

public class FruitAdapter extends ArrayAdapter<Fruit> {private int resourceId;public  FruitAdapter(Context context,int textViewResourceId,List<Fruit> objects){super(context,textViewResourceId,objects);resourceId = textViewResourceId;}@Overridepublic View getView(int position,View convertView,ViewGroup parent){//得到当前项的Fruit实例Fruit fruit = getItem(position);View view;//convertView为空,使用LayoutInflater加载布局//不为空,则直接对convertView进行重用if(convertView==null){view = LayoutInflater.from(getContext()).inflate(resourceId, null);}else{view = convertView;}ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);TextView textView = (TextView) view.findViewById(R.id.fruit_name);fruitImage.setImageResource(fruit.getImageId());fruitName.setText(fruit.getName());return view;}
}

目前代码还可以优化,虽然现在已经不会再重复去加载布局,但每次getView()方法中还是会调用View的findViewById()来获取一次控件实例。下面使用ViewHolder继续优化:

优化方法二:新增一个内部类ViewHolder:
 
class ViewHolder{ImageView fruitImage;TextView fruitName;}

用于对对象的实例进行缓存。当convertView为空,创建一个ViewHolder对象,并将控件的实例都存放在ViewHolder里,然后调用View的setTag()方法将ViewHolder 对象存储在view中。当convertView不为空时,调用View的getTag()方法把ViewHolder取出。这样所有的控件实例都缓存在ViewHolder里了,就不用每次都通过findViewById()方法获取控件实例了。
 
FruitAdapter.java
package com.example.listviewtest;import java.util.List;import android.annotation.SuppressLint;
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;@SuppressLint("ViewHolder")
public class FruitAdapter extends ArrayAdapter<Fruit> {private int resourceId;public  FruitAdapter(Context context,int textViewResourceId,List<Fruit> objects){super(context,textViewResourceId,objects);resourceId = textViewResourceId;}@Overridepublic View getView(int position,View convertView,ViewGroup parent){Fruit fruit = getItem(position);View view;ViewHolder viewHolder;if(convertView==null){view = LayoutInflater.from(getContext()).inflate(resourceId, null);viewHolder = new ViewHolder();viewHolder.fruitImage = (ImageView)view.findViewById(R.id.fruit_image);viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);view.setTag(viewHolder);}else{view = convertView;viewHolder = (ViewHolder)view.getTag();}//View view = LayoutInflater.from(getContext()).inflate(resourceId,null);//ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);//TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);//fruitImage.setImageResource(fruit.getImageId());//fruitName.setText(fruit.getName());viewHolder.fruitImage.setImageResource(fruit.getImageId());viewHolder.fruitName.setText(fruit.getName());return view;}class ViewHolder{ImageView fruitImage;TextView fruitName;}}

activity_main.xml
 
<LinearLayout 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"><ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="match_parent"></ListView></LinearLayout>
 
MainActivity.java
package com.example.listviewtest;import java.util.ArrayList;
import java.util.List;import android.app.Activity;
import android.content.Context;
//import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Toast;import android.widget.ListView;public class MainActivity extends Activity {private String[] data = {"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","cherry","Mango"};private List<Fruit> fruitList = new ArrayList<Fruit>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initFruits();
//public FruitAdapter(Context context,int textViewResourceId,List<Fruit> objects) FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);//ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this,android.R.layout.simple_list_item_1,data);ListView listView = (ListView) findViewById(R.id.list_view);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();}});}private void initFruits() {// TODO Auto-generated method stubFruit apple = new Fruit("Apple",R.drawable.ic_launcher);fruitList.add(apple);Fruit banana = new Fruit("Banana",R.drawable.ic_launcher1);fruitList.add(banana);Fruit orange = new Fruit("Orange",R.drawable.ic_launcher2);fruitList.add(orange);Fruit Watermelon = new Fruit("Watermelon",R.drawable.ic_launcher3);fruitList.add(Watermelon);Fruit Pear = new Fruit("Pear",R.drawable.ic_launcher4);fruitList.add(Pear);Fruit Grape = new Fruit("Grape",R.drawable.ic_launcher5);fruitList.add(Grape);Fruit Pineapple = new Fruit("Pineapple",R.drawable.ic_launcher6);fruitList.add(Pineapple);Fruit Strawberry = new Fruit("S trawberry",R.drawable.ic_launcher7);fruitList.add(Strawberry);Fruit cherry = new Fruit("Cherry",R.drawable.ic_launcher8);fruitList.add(cherry);Fruit mango = new Fruit("Mango",R.drawable.ic_launcher9);fruitList.add(mango);}
}

ListView的使用用ViewHolder提升效率相关推荐

  1. Mac Android开发提升效率的工具、插件、心得集锦(gif动画演示)

    首先附上思维导图,之后我的文章大部分都会附上思维导图,感觉思维导图不仅能帮助我梳理文章思路,也能起到个目录作用.图片比较多,加载时间可能会长点. 首先是Android studio插件 1.Butte ...

  2. VScode提升效率技巧教程

    VScode提升效率技巧教程 前言 一.快捷键 1. CTRL + P 2. CTRL + T 3. F12 4. CTRL + F 5. CTRL + J 6. ALT + ⬅/➡ 7. ALT + ...

  3. 贝壳的平台模式成长逻辑:如何赋能品牌提升效率

    作为中国存量房市场上最大的玩家,链家正在从它最成功的垂直直营战场外,尝试平台模式.而创立于2018年初,从链家网升级而来的贝壳找房正行进在这一"平台"的大道之上. 凭借多年发展,链 ...

  4. 纯前端表格控件SpreadJS以专注业务、提升效率赢得用户与市场

    提起华为2012实验室,你可能有点陌生. 但你一定还对前段时间华为的那封<海思总裁致员工的一封信>记忆犹新,就在那篇饱含深情的信中,我们知道了华为为确保公司大部分产品的战略安全和连续供应, ...

  5. 协助武汉红会的九州通,是如何利用云计算来提升效率的

    这几日,武汉的疫情牵动着全国人民的心.各地同胞捐款捐物,希望能够有效帮助处于疫情重灾区的武汉和湖北省人民尽快缓解疫情.恢复生活生产.然而,武汉红十字会的工作方式和效率却不尽如人意. 2月2日下午15时 ...

  6. LED照明电路:利用MOSFET提升效率并降低噪声的案例

    从本文开始将介绍在具体应用中效率等的改善案例. LED照明电路(临界模式PFC+DC/DC):利用MOSFET提升效率并降低噪声的案例 下面的电路摘自实际LED照明电路的相关部分.该LED驱动电路是D ...

  7. 提升效率教程——Clover 资源管理器标签-Chinar

    Chinar blog :www.chinar.xin Clover 资源管理器增强 妈妈再也不用担心,我找不到资源 本文提供全流程,中文翻译. Chinar 的初衷是将一种简单的生活方式带给世人 使 ...

  8. SpringBoot 【IDEA热部署+浏览器禁用缓存】迅速提升效率

    SpringBoot微服务写页面,每次都需要重启才生效,使用[IDEA热部署+浏览器禁用缓存]迅速提升效率: 参考 https://blog.csdn.net/qq_27416233/article/ ...

  9. R语言dataframe(data.table)使用用最近的前一个非NA值向前填充缺失值NA实战

    R语言dataframe(data.table)使用用最近的前一个非NA值向前填充缺失值NA实战 目录 R语言dataframe(data.tabl

最新文章

  1. java mina多线程_mina2中的线程池
  2. 计算机考研择校分析,上海地区计算机考研择校分析
  3. Android开机画面~(自己还没试验)
  4. 中if判断中文_当Excel表格中的条件判断超过8个,用IF函数不容易实现怎么办?...
  5. ndoejs优先从缓存加载机制
  6. python需要的环境_python运行环境是什么
  7. SQL Server 索引结构及其使用(三)(转)
  8. Tomcat 通用组件
  9. 一套房钱就可以做一个品牌的电子烟,让罗永浩们再赚一波快钱?
  10. 数学与计算机科学学院宣传词,【榜样人物】筑梦前行 不负韶华——数学与计算机科学学院姚彬彬同学的考研心路...
  11. mac OS X下终端使用tree命令列目录
  12. cisco port-channel配置
  13. 超好玩的msn自制动画头像
  14. MATLAB曲线平滑的办法
  15. Nodejs busBoy和fs模块完成文件的上传
  16. 家政上门预约服务小程序源码+前端后端
  17. SDH同步数字系列(Synchronous Digital Hierarchy,SDH)--SONET同步光网络(Synchronous Optical NETwork,SONET)
  18. MySQL数据库,创建表空间
  19. C# int uint long ulong byte sbyte float double decimal 范围,及类型!
  20. 基于内容的图片检索CBIR简介

热门文章

  1. 普通话/汉语发音口型大全
  2. python字符串排序_Python-如何对字符串列表进行排序?
  3. python正则_python的正则表达式
  4. 网页设计图片向上浮动_利用js实现图片在浏览器中飘动(浮动窗口自由移动)效果...
  5. 用户首次登录之前必须更改密码_技术丨带你玩转Win10系统的用户账户
  6. 如何优雅地检测类型/表达式有效性?
  7. C++ 异常的详细介绍
  8. windows服务器系统免登录,Mac系统登录Windows服务器
  9. 乐播投延迟很高_大屏也要高刷新!华为4K@120智慧屏初体验,屏幕软件都够硬
  10. python图像转字符画_python图像处理-字符画风格图片