在使用ListView的时候,需要加载适配器和数据源,这篇文章主要介绍一下ListView的使用以及利用ListView的缓存机制来减少系统的初始化时间。

ListView的使用


ListView和ViewPager很类似,首先在ArrayList中存放数据源,并把它作为Adapter的构造函数的参数传入Adapter类中,之后在Adapter中实现相应方法,具体代码如下:

1.在ArrayList中存放数据源

由于ListView中,每一个View是一个Item,所以数据源中需要存放Item当中每一个View的信息,因此,可以定义一个自定义类来存放这些需要存放的信息。代码如下:

XML中,声明Item,包括一个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="wrap_content"
android:orientation="horizontal">
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/add"
android:id="@+id/goods_iv"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/goods_tv"/> </LinearLayout>

自定义Goods类来存放需要修改的信息:

public class Goods
{
public String text;
public int ImageId;
}

在Activity中声明ArrayList,并生成数据源:

ArrayList<Goods> goods=new ArrayList<>();
for(int i=1;i<=20;i++)
{
Goods good=new Goods();
good.ImageId=R.drawable.good;
good.text="商品"+i;
goods.add(good);
}

2.构造适配器

ListView的适配器为BaseAdapter,其中getCount(),getItem()和getItemID()三个方法与PageAdapter类似,最有讲究的便是getView方法,这里着重讲解一下getView的写法:

getView方法,主要是获取position位置的View对象。我们可以每次都声明一个新的View,并通过findViewById获取Item中的每个控件,但这样会用到大量的耗时操作,并重复占用资源。因此,我们可以利用ListView的缓存机制,来获取这些View对象。

首先,在BaseAdapter中,声明一个内部类,用来存放已经缓存好的每一个组件:

class ViewHolder
{
public ImageView iv;
public TextView tv;
}

然后,对应getView每一个需要加载的View来说,判断他是否已经被加载过,如果没有,便进行加载,并利用View的setTag方法,把已经加载的View和组件相关联:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder viewHolder;
if(convertView==null)
{
convertView=inflater.inflate(R.layout.item_goods,null);
viewHolder=new ViewHolder();
viewHolder.iv= (ImageView) convertView.findViewById(R.id.goods_iv);
viewHolder.tv= (TextView) convertView.findViewById(R.id.goods_tv);
convertView.setTag(viewHolder);
}

若已经加载过,则直接取出,进行组件的修改即可:

else
{
viewHolder= (ViewHolder) convertView.getTag();
}
Goods good=goodslist.get(position);
viewHolder.iv.setImageResource(good.ImageId);
viewHolder.tv.setText(good.text);
return convertView

3.ListView与适配器向关联

与ViewPager类似,这里只给出代码,不再赘述

GoodsAdapter adapter=new GoodsAdapter(goods,getContext());
listview.setAdapter(adapter);

Android学习——ListView的缓存机制的更多相关文章

  1. Android笔记(二十五) ListView的缓存机制与BaseAdapter

    之前接触了ListView和Adapter,Adapter将数据源和View连接起来,实际应用中,我们要显示的数据往往有很多,而屏幕只有那么大,系统只能屏幕所能显示的内容,当我们滑动屏幕,会将旧的内容 ...

  2. 探究ListView 的缓存机制

    概述 ListView 是继承AbListView,AbListView是所有列表类控件的基类. ListView的数据加载 在ListView数据加载中最关键的一个函数就是makeAndAddVie ...

  3. 九、Android学习第八天——广播机制与WIFI网络操作(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...

  4. android 视频的缩略图 缓存机制和 异步加载缩略图

    在这次的工作开发项目中,涉及到一个视频缩略图的视频列表:这个在大家看来,制作视频缩略图就是两行代码就搞定的事.确实是这样的,百度一下,每个帖子都知道制作视频缩略图的方法,在这里确实也是一样的,但是我要 ...

  5. 学习ASP.NET缓存机制

    缓存是大型BS架构网站的性能优化通用手段,之前知道有这个概念,并且也知道很重要,但是一直没静下心来了解.这次借着学习PetShop源码的机会熟悉一下ASP.NET基本的缓存机制(生产环境中的真实缓存有 ...

  6. Android学习---ListView和Inflater的使用,将一个布局文件转化为一个对象

    本文将介绍ListView和Inflater的使用,将接上一篇文章内容. 一.什么是ListView? 在android开发中ListView是比较常用的控件,ListView 控件可使用四种不同视图 ...

  7. Android学习--ListView

    这篇文章用于总结自己这两天学到的安卓的ListView和RecyclerView 的笔记,以及从我这个iOS开发者的角度去理解和学习这两个控件,会比较一下他们个iOS中那些控件是一致的,可以用来对比的 ...

  8. android 学习 ListView使用补充

    前面两篇学习适配器的时候用的就是listview,主要是简单的添加,今晚在看了下listview滚动状态事件和动态加载数据,一个小demo. listview的滚动状态主要有三种,onScrollSt ...

  9. Android学习---ListView的点击事件,simpleAdapter和arrayadapter,SimpleCursoAdapter的原理和使用

    如题,本文将介绍 listview的点击事件,simpleAdapter和arrayadapter的原理和使用. 1.ListView的注册点击事件 //注册点击事件 personListView.s ...

随机推荐

  1. python自动化day3-函数、递归、内置函数

    一.什么是函数 修理工===>程序员 具备某一功能的工具===>函数 要想使用工具,需要事先准备好,然后拿来就用且可以重复使用要想用函数,需要先定义,再使用 二.函数基础 1.函数分类 # ...

  2. Java - 二分法查找(尚学堂第七章数组)

    import java.util.Arrays; public class TestBinarySearch { public static void main(String[] args) { in ...

  3. es6精华

    函数: ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面.function log(x, y = 'World') { console.log(x, y); } log('Hello') ...

  4. logback.xml文件配置(按时间、文件大小和log名称生成日志)

    之前项目中日志多用的log4j2,偶然看到在importNew看到了logback,自己查了下,发现Logback和log4j是非常相似的,其作者也是同一个人,并且logback相比于log4j性能更 ...

  5. python+unittest+requests实现接口自动化

    前言: Requests简介 Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2  ...

  6. Cookie跳转登录验证码

    对于web应用来说,大部分的系统在用户登录时都要求用户输入验证码,验证码的类型的很多,有字母数字的,有汉字的,甚至还要用户输入一条算术题的答案的, 对于系统来说使用验证码可以有效果的防止采用机器猜测方 ...

  7. Linux将MySQL数据库目录挂载至新数据盘

    对于Linux系统来说,挂载磁盘的方法其实都大同小异,所以本文以CentOS系统为例,介绍下Linux系统磁盘挂载方法,前面大部分内容源于天翼云的论坛.1.查看磁盘情况使用命令fdisk -l # 列 ...

  8. CentOS 7禁止IPv6

    如何在CentOS 7中禁止IPv6 https://Linux.cn/article-4935-1.html 最近,我的一位朋友问我该如何禁止IPv6.在搜索了一番之后,我找到了下面的方案.下面就是 ...

  9. CF520B——Two Buttons——————【广搜或找规律】

    J - Two Buttons Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Su ...

  10. 利用WebBrowser控件实现百度自动搜索

    (1)新建一个MFC对话框项目 (2)对话框中添加WebBrower控件,添加方法:点击菜单栏工具->选择工具箱项->在弹出的选择工具箱项对话框选择COM组件->Microsoft  ...