Android中ListView的使用以及提升ListView的运行效率

ListView是安卓中非常常用的一个控件,可以用来展示一系列的数据,下面来介绍下ListView的用法和如何提升ListView的效率

ListView的使用遵循MVC模式,m是实体,v是视图(即为ListView),C是控制器(即未适配器adapter)

使用ListView一般可以遵循以下步骤

一、定义一个ListView展示的条目的布局

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="10dp"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/tv_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textSize="20sp"
        android:layout_centerVertical="true"
        android:layout_marginRight="10dp"
        android:text="测试应用" />

</RelativeLayout>

  

二、定义一个数据实体(javabean)

package com.jsako.listviewdemo.domain;

import android.graphics.drawable.Drawable;

public class AppInfo {

    private String appName;
    private Drawable appIcon;
    @Override
    public String toString() {
        return "AppInfo [appName=" + appName + ", appIcon=" + appIcon + "]";
    }
    public String getAppName() {
        return appName;
    }
    public void setAppName(String appName) {
        this.appName = appName;
    }
    public Drawable getAppIcon() {
        return appIcon;
    }
    public void setAppIcon(Drawable appIcon) {
        this.appIcon = appIcon;
    }

}

三、初始化数据(准备好需要展示的数据,可以读取数据库获取,可以通过网络下载获取)

private List<AppInfo> appInfos=new ArrayList<AppInfo>();private void initAppInfos() {
        List<ApplicationInfo> infos=pm.getInstalledApplications(0);
        AppInfo appInfo;
        for(ApplicationInfo info:infos){
            appInfo=new AppInfo();
            appInfo.setAppIcon(info.loadIcon(pm));
            appInfo.setAppName(info.loadLabel(pm).toString());
            appInfos.add(appInfo);
        }
    }

四、定义一个适配器内部类

private class MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return appInfos.size();

        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
            ViewHolder holder;
            if(convertView!=null){
                view=convertView;
                holder=(ViewHolder) view.getTag();
            }else{
                view=View.inflate(getApplicationContext(), R.layout.list_item, null);
                holder=new ViewHolder();
                holder.iv_icon=(ImageView) view.findViewById(R.id.iv_icon);
                holder.tv_text=(TextView) view.findViewById(R.id.tv_text);
                view.setTag(holder);
            }
            holder.iv_icon.setImageDrawable(appInfos.get(position).getAppIcon());
            holder.tv_text.setText(appInfos.get(position).getAppName());
            return view;
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        class ViewHolder{
            ImageView iv_icon;
            TextView tv_text;
        }
    }

五、找到ListView的对象,然后设置适配器

lv=(ListView) findViewById(R.id.lv_show);
        lv.setAdapter(new MyAdapter());

以上就是ListView的基本使用方法,下面我们来谈谈提升ListView的效率

1、在MyAdapter里的getView方法中,ListView没显示一条条目都会调用该方法一次,里面有个参数是convertView,这个参数用于将之前加载好的布局进行缓存,以便以后进行重用

所以我们可以对convertView进行判断,判断它是否为null,如果不为null则复用它,如果为null则通过View.inflate()方法加载一个布局view对象。这样就可减少对内存的开销,复用以前的缓存,提升效率。

2、再则新增了一个内部类ViewHolder,用于对每个小条目里的控件的实例进行缓存。然后当convertView为null的时候将ViewHolder的实例通过view.setTag()保存起来,在convert不为空的时候将ViewHolder的实例通过view.getTag()取出,

然后设置对应的值。这样就能避免ListView每次调用getView的时候都调用view.findViewById(),这个方法非常耗时,降低性能。采取ViewHolder内部类的这种方法能提升效率。

时间: 2024-07-29 02:22:28

Android中ListView的使用以及提升ListView的运行效率的相关文章

Android中RecyclerView嵌套RecyclerView或嵌套ListView

Android中RecyclerView嵌套RecyclerView或嵌套ListView

浅谈Android中的异步加载之ListView中图片的缓存及优化三

     隔了很久没写博客,现在必须快速脉动回来.今天我还是接着上一个多线程中的异步加载系列中的最后一个使用异步加载实现ListView中的图片缓存及其优化.具体来说这次是一个综合Demo.但是个人觉得里面还算有点价值的就是里面的图片的缓存的实现.因为老实说它确实能在实际的项目中得到很好的应用.主要学习来源于慕课网中的异步加载学习,来自徐宜生大神的灵感.本次也就是对大神所讲知识的一个总结及一些个人的感受吧. 这次是一个综合的Demo,主要里面涉及到的知识主要有:网络编程.异步加载.JSON解析.

使用NDK实现Android中C与Java交叉编译

android中的java依托于java虚拟机,运行效率是比较低的,最近在做高效大数乘法中,发现了JNI或者NDK可以实现C与Java混编,并且引用c的动态库,而且android中的C语言不需要依托java虚拟机,效率还是非常高的. 一.开发环境的搭建 开发java的话还是eclipse不变,除此之外下载 android-ndk-r9d-linux-x86_64.tar.bz2(linux),安装方法: $ cd android-ndk-r9d/ $ build/tools/make-stand

Android中ListView滑动时数据混乱

相信做过Android应用开发的或多或少的都遇到过这样的问题,要不就是在ListView滑动时出现数据混乱,或者是GridView滑动时出现数据混乱.先来看看一位网友写的文章,个人感觉这篇文章挺不错的: Android ListView滑动过程中图片显示重复错位闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复.错乱.闪烁的原因及解决方法,顺带提及ListView的缓存机制. 1.原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行i

Android中监听ListView滑动到底部

Android中的应用就是ListView中向下滑动加载更多的功能,不要再onScroll方法中进行判断,那样当滑动到底部的时候,可能我们需要触发点什么事件,比如加载更多.隐藏某个控件等等. 第一种方法是直接滑动到底部就触发 listview.setOnScrollListener(new OnScrollListener(){       @Override       public void onScrollStateChanged(AbsListView view, int scrollS

Android中适用于ListView、GridView等组件的通用Adapter

今天随便逛逛CSDN,看到主页上推荐了一篇文章Android 快速开发系列 打造万能的ListView GridView 适配器,刚好这两天写项目自己也封装了类似的CommonAdapter,以前也在github上看到过这样的库,于是自己也把自己的代码再次整理出来与大家分享,也希望能够在CSDN这个平台上学到更多的东西,下面就一起来看看吧. 平时我们在项目中使用到ListView和GridView组件都是都会用到Adapter,比较多的情况是继承自BaseAdapter,然后实现getCount

Android中一个关于ListView的奇怪问题

今天在做项目的时候发现了一个比较奇怪的问题,是关于ListView的,即ListView的android:height属性会影响程序中ListView的getView()方法的调用次数,如果设置ListView的android:height属性为0dp,同时设置android:weight=1,或者直接设置android:height属性为"wrap_content",那么ListView在展示数据的时候,getView()被执行的次数并不会是传入数据集合的size,而会比size的值

Android中设置ListView内容刷新问题

最近在学习Android的listView控件时遇到了一个问题,如何添加一个Item到ListView中并及时的刷新出来.在网上查了很多帖子,很多人在问,也很多人在解答,但是总的来说都没找到详细的解决方案.对于ListView与数据库的同步,高手们建议使用ContentProvider对象.但是如果我不使用数据库呢?也有人回答用notifyDataSetChanged()方法.这倒是一个正确的解决方案,但是对于新手来说,还是比较困惑怎么去用,这里我贴一下我的用法: 代码 OnClickListe

Android中使用ListView绘制自定义表格(2)

上回再写了<Android中使用ListView绘制自定义表格>后,很多人留言代码不全和没有数据样例.但因为项目原因,没法把源码全部贴上来.近两天,抽空简化了一下,做了一个例子. 效果图如 一.功能: 1.支持列合并 2.考虑了界面刷新优化 3.预留部分接口 4.支持左右滚动 1.枚举类:CellTypeEnum package csdn.danielinbiti.custometableview.item; public enum CellTypeEnum { STRING //字符 ,DI