在使用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. iview2.0 bug之+8 区的 DatePicker

    请看以上细节图:工作案例小Demo 用心去做,不留遗憾!

  2. es中的date类型

    JSON中没有date类型,es中的date可以由下面3种方式表示: ①格式化的date字符串,例如"2018-01-01"或者"2018-01-01 12:00:00& ...

  3. Python 自定义iterator生成器

    #计数版 class countdown(object): def __init__(self,start): self.start = start def __iter__(self): retur ...

  4. c# xml序列化和反序列化。也就是xml的解析和反解析。

    用习惯了newTownSoft.json 的json反序列化.碰到xml是真的不习惯. 每次json反序列化都是直接把json丢到bejson网站生成一个实体类,稍微修改修改一点点变量名.然后直接ne ...

  5. Oracle PL/SQL编程之基础

    1.简介:pl/sql块由三个部分组成:定义部分.执行部分.例外处理部分,如下所示: declare: /*定义部分---定义常量.变量.游标.例外.复杂数据类型 begin /*执行部分---要执行 ...

  6. Robot Framework自动化测试二(元素定位)

    前言 在学习的过程中,可能会误认为Robot framework 只是个web UI测试工具,更正确的理解Robot framework是个测试框架,之所以可以拿来做web UI层的自动化是国为我们加 ...

  7. 运行时用AnimatorOverrideController动态加载动画片段

    https://blog.csdn.net/tlrainty/article/details/54602786 项目中经常会遇到这种情况:很多模型动画的AnimatorController是一模一样的 ...

  8. unity代码设置鼠标样式

    public class Main : MonoBehaviour { public Texture2D cursorTexture;//图片 public CursorMode cursorMode ...

  9. web项目 log4j2 指定配置文件路径

    pom.xml需要额外引入的jar: <dependency> <groupId>org.apache.logging.log4j</groupId> <ar ...

  10. [转载+原创]Emgu CV on C# (五) —— Emgu CV on 局部自适应阈值二值化

    局部自适应阈值二值化 相对全局阈值二值化,自然就有局部自适应阈值二值化,本文利用Emgu CV实现局部自适应阈值二值化算法,并通过调节block大小,实现图像的边缘检测. 一.理论概述(转载自< ...