android之listView缓存机制

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="com.example.day_05_06.MainActivity" >

<ListView 
        android:id="@+id/lvGenerals"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="#ccc"
        android:dividerHeight="20dp"/>

</RelativeLayout>

MainActivity.java:

package com.example.day_05_06;

import java.util.ArrayList;
import java.util.List;

import com.litsoft.General.General;

import android.support.v7.app.ActionBarActivity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
private ListView lvGenerals;//listView对象
private List<General> generals ;//数据集合
private BaseAdapter adapter;//适配器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
private void initView() {
// TODO Auto-generated method stub
lvGenerals = (ListView) findViewById(R.id.lvGenerals);
adapter = new GeneralAdapter(this,generals);
lvGenerals.setAdapter(adapter);
}
private void initData() {
// TODO Auto-generated method stub
generals = new ArrayList();

int [] images = new int[] {
R.drawable.baiqi,R.drawable.caocao,R.drawable.chengjisihan,
R.drawable.hanxin,R.drawable.lishimin,R.drawable.nuerhachi,
R.drawable.sunbin,R.drawable.sunwu,R.drawable.yuefei,
R.drawable.zhuyuanzhang
};
String [] names = getResources().getStringArray(R.array.generals);
for(int i=0;i<images.length;i++){
General general = new General(images[i],names[i]);
generals.add(general);
}
}
class GeneralAdapter extends BaseAdapter{
private Context context;
private List<General> innerGenerals;
public GeneralAdapter(Context context, List<General> innerGenerals) {//这里用构造器的方式传递外部类的上下文对象和General集合对象
super();
this.context = context;
this.innerGenerals = innerGenerals;
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return generals.size();
}

@Override
public General getItem(int position) {
// TODO Auto-generated method stub
return generals.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Log.i("main", position+"");
ViewHolder viewHolder = null;

if(convertView == null){//第一屏中尚未创建列表项时
viewHolder = new ViewHolder ();
convertView = View.inflate(context, R.layout.general, null);
viewHolder.ivGerneral = (ImageView) convertView.findViewById(R.id.ivThumb);
viewHolder.tvName = (TextView)convertView.findViewById(R.id.tvName);
convertView.setTag(viewHolder);//这里相当于初始化一次用于适配的布局,以后都用这个布局了,就是滚动的时候就不用再初始化用于适配的布局
}else{//以后的滚动,出现其他的列表项
viewHolder = (ViewHolder) convertView.getTag();
}
General general = this.innerGenerals.get(position);
viewHolder.ivGerneral.setImageResource(general.getImageSrc());
viewHolder.tvName.setText(general.getName());
return convertView;
}

}
class ViewHolder{//用于适配布局的具体项
ImageView ivGerneral;
TextView tvName;
}

}

适配的页面布局:general.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"
    android:orientation="horizontal" >
    
<ImageView 
    android:id="@+id/ivThumb"
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:src="@drawable/baiqi"/>
<TextView 
    android:id="@+id/tvName"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:text="白起"
    />
</LinearLayout>

General.java:

package com.litsoft.General;

public class General {
private int imageSrc;
private String name;
public int getImageSrc() {
return imageSrc;
}
public void setImageSrc(int imageSrc) {
this.imageSrc = imageSrc;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public General(int imageSrc, String name) {
super();
this.imageSrc = imageSrc;
this.name = name;
}

}

strings.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>

<string name="app_name">Day_05_06</string>
    <string name="hello_world">Hello world!</string>
    <string name="action_settings">Settings</string>
<string-array name="generals">
   <item>白起</item>
   <item>曹操</item>
   <item>成吉思汗</item>
   <item>韩信</item>
   <item>李世民</item>
   <item>努尔哈赤</item>
   <item>孙膑</item>
   <item>孙武</item>
   <item>朱元璋</item>
   <item>岳飞</item>
</string-array>
</resources>

效果:

时间: 2024-11-08 21:06:20

android之listView缓存机制的相关文章

手把手教你构建 Android WebView 的缓存机制 &amp; 资源预加载方案

前言 由于H5具备 开发周期短.灵活性好 的特点,所以现在 Android App大多嵌入了 Android Webview 组件进行 Hybrid 开发 但我知道你一定在烦恼 Android Webview 的性能问题,特别突出的是:加载速度慢 & 消耗流量 今天,我将针对 Android Webview 的性能问题,提出一些有效解决方案. 目录 1. Android WebView 存在什么性能问题? Android WebView 里 H5 页面加载速度慢 耗费流量 下面会详细介绍. 1.

android:ListView缓存机制及BaseAdapter的三重境界(逗比式,普通式,文艺式)

大家都知道listview的格式是一定的 而数据源确是多重多样的 这时候 就需要一种适配器来把数据源转换成listview要显示的格式 baseAdapter就诞生了. listview和gridView的显示和缓存机制 如下图 大家都知道屏幕的大小是有限的 可是listview中的数据却可能很多 所以手机不能一下子展示所有的数据 它只会加载屏幕上显示的数据 . 如上图,当我们把屏幕往下滑动时 item1回收到recycler 而item8要显示在屏幕上 item8从recycler取出这样一个

Android性能优化之ListView缓存机制

要想优化ListView首先要了解它的工作原理,列表的显示需要三个元素:ListView.Adapter.显示的数据: 这里的Adapter就是用到了适配器模式,不管传入的是什么View在ListView中都能显示出来. 下面简单说下上图的原理: 1.如果你有几千几万甚至更多的选项(item)时,其中只有可见的项目(满屏显示的Item数目)存在内存(说的优化就是说在内存中的优化!)中,其他的在Recycler中 2.ListView先请求一个type1视图(getView)然后请求其他可见的项目

ListView缓存机制

要想优化ListView首先要了解它的工作原理,列表的显示需要三个元素:ListView.Adapter.显示的数据: 这里的Adapter就是用到了适配器模式,不管传入的是什么View在ListView中都能显示出来. 下面简单说下上图的原理: 1.如果你有几千几万甚至更多的选项(item)时,其中只有可见的项目(满屏显示的Item数目)存在内存(说的优化就是说在内存中的优化!)中,其他的在Recycler中 2.ListView先请求一个type1视图(getView)然后请求其他可见的项目

ListView缓存机制踩过的坑

ListView,GrildView使用时候经常会用到缓存机制,随意一搜,例子成千上万,但是讲解都是很一致,跟自己踩的坑很少有人讲解到. 测试 需求: GrildView 分三列显示,默认背景为白色,如果当前ID能被2整除 就显示一张图片,如果能被三整除并且不能被2整除 背景变成灰色. getView代码: 运行显示:第一张图未进行滑动之前显示正常,然后随意滑动回来显示第二张图,呵呵,那么问题来了,图片顺序错乱了,但是为什么名字没错乱呢,呵呵,这一切都是缓存没有用好惹的货. 回过头再进行分析ge

Android 中的缓存机制与实现

Android开发本质上就是手机和互联网中的web服务器之间进行通信,就必然需要从服务端获取数据,而反复通过网络获取数据是比较耗时的,特别是访问比较多的时候,会极大影响了性能,Android中可通过二级缓存来减少频繁的网络操作,减少流量.提升性能. 一.二级缓存工作机制 所谓二级缓存实际上并不复杂,当Android端需要获得数据时比如获取网络中的图片,我们首先从内存中查找(按键查找),内存中没有的再从磁盘文件或sqlite中去查找,若磁盘中也没有才通过网络获取:当获得来自网络的数据,就以key-

Android中的缓存机制与实现

分步阅读 Android开发本质上就是手机和互联网中的web服务器之间进行通信,就必然需要从服务端获取数据,而反复通过网络获取数据是比较耗时的,特别是访问比较多的时候,会极大影响了性能,Android中可通过二级缓存来减少频繁的网络操作,减少流量.提升性能. 方法/步骤 二级缓存工作机制 所谓二级缓存实际上并不复杂,当Android端需要获得数据时比如获取网络中的图片,我们首先从内存中查找(按键查找),内存中没有的再从磁盘文件或sqlite中去查找,若磁盘中也没有才通过网络获取:当获得来自网络的

Android的Drawable缓存机制源码分析

Android获取Drawable的方式一般是Resources.getDrawable(int),Framework会返回给你一个顶层抽象的Drawable对象.而在Framework中,系统使用了享元的方式来节省内存.为了证明这一点,我们来写一个小demo: 我们在我们的Android项目中引入一个简单的图片test.png.由于我们只是为了享元的结论,我们定义一个简单的Activity,并复写它的onCreate方法: List<Bitmap> list = new ArrayList&

Android 图片的缓存机制分析

LruCache 初始化 /** * @param maxSize for caches that do not override {@link #sizeOf}, this is * the maximum number of entries in the cache. For all other caches, * this is the maximum sum of the sizes of the entries in this cache. */ public LruCache(int