`

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>

效果:


 

分享到:
评论

相关推荐

    ListView缓存机制

    ListView是Android平台上常用的一种...总的来说,理解并合理运用ListView的缓存机制是提升Android应用性能的重要手段。开发者需要根据具体项目需求,结合优化策略,确保ListView在处理大量数据时能保持优秀的用户体验。

    Android之ListView列表视图和界面跳转实现

    - **复用视图**:为了提高性能,ListView使用了视图缓存机制。在`getView()`中,我们检查`convertView`是否为空,如果非空,则重用已有的视图,避免频繁创建新视图。 - **ViewHolder模式**:为了进一步提升性能,...

    Android使用缓存优化ListView

    在ListView的Adapter中,最常见的做法是重写`getView()`方法,并在此方法中使用缓存机制。当需要创建一个新的View时,首先检查缓存中是否已有复用的View。如果有,就直接复用,否则才去创建新的View。这种方式称为...

    Android ListView扩展(图片+文字)

    可以使用LruCache或其他缓存机制来存储已加载的图片,减少内存占用。 9. 动态加载:在实际应用中,数据可能来自网络或数据库。这时,你需要在后台线程中异步加载数据,然后更新Adapter,调用`notifyDataSetChanged...

    Android中ListView实现表格效果

    在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。然而,有时我们不仅需要展示单一列表,还可能需要实现类似表格的效果,比如显示多列数据。本篇文章将详细讲解如何在Android中利用ListView...

    android 嵌套的listview示例

    利用ListView的缓存机制,重用convertView,减少不必要的对象创建。 - 使用`HeaderView`和`FooterView`可以避免在Item中创建复杂的布局,提高效率。 - 对于子ListView,尽可能使用`RecycleView`代替`ListView`,...

    android中ListView下拉刷新

    9. **性能优化**:在处理大量数据时,注意ListView的性能优化,如使用ViewHolder模式减少视图查找的开销,以及适配器的缓存策略。 10. **测试与调试**:在实际项目中,需要对下拉刷新功能进行充分的测试,包括正常...

    Android实现ListView异步加载图片

    "Android实现ListView异步加载图片" Android 实现 ListView 异步加载图片是一种常见的技术,旨在提高应用程序的性能和用户体验。本文将详细介绍 Android 中实现 ListView 异步加载图片的方法,并对相关的技术概念...

    android 中ListView下载图片

    3. **图片缓存策略**:异步加载库通常都支持缓存机制,包括内存缓存和磁盘缓存。当图片加载时,首先检查内存缓存,如果存在则直接使用;若不在内存中,再从磁盘读取或从网络下载。这样可以减少网络请求,提高用户...

    android打造listview通用适配器

    3. **ViewHolder**:创建一个内部类,实现对ListView项的视图缓存。ViewHolder持有对每个列表项需要显示的视图的引用。 4. **getView()方法**:在适配器中重写`getView()`方法,使用ViewHolder来减少视图查找的开销...

    Android 解决ListView的复用问题 demo

    总之,理解和掌握ListView的复用机制对于任何Android开发者来说都是至关重要的,它不仅可以提升应用的性能,还能帮助开发者编写出更加健壮和高效的代码。这个demo和相关的博客文章为学习和实践这一关键技巧提供了...

    Android之ListView<2>

    这篇博客“Android之ListView”可能深入探讨了ListView的高级用法和优化技巧,尽管描述部分为空,我们可以根据标签“源码”和“工具”推测内容会涉及到ListView的内部实现原理和实际开发中的实用技巧。 ListView的...

    android SQlite、listView中加按钮的使用

    在Android开发中,SQLite是一个非常重要的本地数据存储机制,它是一个轻量级的数据库,能够帮助开发者在应用程序中实现数据的持久化。SQLite支持多种数据类型,如整型、浮点型、字符串和二进制数据,使得它可以适应...

    Android自定义ListView图片从服务端获取

    图片加载库如Glide和Picasso已经内置了这些缓存机制,我们只需配置好缓存大小即可。 4. **ListView的优化**: - 使用ViewHolder模式:减少findViewById的调用,提高列表滑动的流畅性。 - 图片加载监听:通过监听...

    知识共享-Android之ListView滑动加载、软缓存、懒加载(雷惊风)

    此外,他还可能使用了某种形式的内存缓存机制,比如SoftReference或WeakReference,来保存ListView的项,只有在需要时才加载和绘制。懒加载的实现可能在Adapter的getView()方法中,只在列表项即将可见时加载对应的...

    android listview 自定义样式实例

    在Android开发中,ListView是一种非常常见的控件,用于展示大量数据列表。...同时,合理利用缓存机制和监听器可以极大地提升用户体验和应用性能。在实际开发中,要不断优化和调整,以达到最佳效果。

    android中listview实现下拉自动分页刷新资源

    在Android应用开发中,ListView是展示大量数据列表的常用组件,尤其在实现分页加载和下拉刷新功能时,它的作用更加突出。本教程将详细讲解如何在Android中利用ListView实现下拉自动分页刷新的功能。 首先,我们需要...

    Android双缓存机制

    在Android开发中,为了优化用户体验,特别是在处理大量数据如ListView或GridView时,通常会采用双缓存机制来解决图片加载的问题。这种机制主要是为了解决因网络延迟或内存不足导致的图片加载慢或者闪退等问题。双...

    Android-ListView-Example

    ViewHolder是一个静态内部类,用于缓存ListView条目中的视图引用,避免频繁的findViewById()调用。 6. **点击事件处理**:通过设置OnItemClickListener,可以监听ListView条目的点击事件。当用户点击一个条目时,会...

Global site tag (gtag.js) - Google Analytics