关于ListView的优化

  ListView是Android开发中非常常用的组件。不论是内容还是设置,只要是同格式的非单一的内容,都需要使用ListView。

  ListView中有很多奇巧,最最简单的就是SimpleAdapter。就要显示的内容与布局中的组件一一对应。

  SimpleAdapter是一个适配器,通过它开发者设置ListView的Item布局中的组件与数据之前的对应关系,可以形成包含了ImageView和TextView的Item。

  关于这个的用法,可以参考fooCoder的博客:http://www.cnblogs.com/noTice520/archive/2011/12/05/2276379.html

  但是,有时候,我们的需求会比较复杂。比如,我们可能会需要在Item中有一个Button。如果,继续用上面的方法,Button是没有办法获得焦点的,我们的点击只会触发ListView的Item的点击事件,不会触发Button的点击事件。另外,当我们需要显示非常多的Item时,ListView会试图一次将所有的Item都显示出来,这样的做法会给系统带来相当大的负担,甚至有可能导致OOM。此时,我们就需要使用BaseAdapter来生成ListView。当我们自己建的Adapter继承BaseAdapter时,我们需要实现几个方法。  

        @Override
        public int getCount() {
            return adapterObjectList.size() ;
        }
        @Override
        public Object getItem(int position) {
            return null;
        }
        @Override
        public long getItemId(int position) {
            return 0;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {     }

  关于BaseAdapter的用法,我们同样可以参考上面的链接http://www.cnblogs.com/noTice520/archive/2011/12/05/2276379.html

  但是,这终归是比较麻烦的。因为一个ListView的显示代码将会非常的长,如果要修改其中的布局,也是非常的麻烦。原理既然已经有大大写这里了,我在这里就做了一个不成熟的父类,将时常需要变更的代码与不常变更的代码分开,方便使用。代码如下:

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import java.util.List;

/**
 * Created by Administrator on 2015/4/4.
 */
public abstract class EasyListView extends ListView {
    public EasyListView(Context context) {
        super(context);
    }
    public EasyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public EasyListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    Context mContext;
    int mItemLayoutId;
    EasyListView mSonListView;

    /**
     * 获得ListView的Item中的布局文件的Id
     * @return  mItemLayoutId
     */
    protected abstract int getListViewItemLayoutId();
    /**
     * 获取Item中组件的Id
     * @param convertView Item所在的View
     */
    protected abstract void getViewId(View convertView);
    /**
     * 更新Item中的组件
     */
    protected abstract void updateView(Object dataObject);

    /**
     * 更新ListView界面
     * @param context   上下文
     * @param inputDataList 获取信息
     */
    public abstract void updateListView(Context context , List<?> inputDataList);
    protected MyAdapter getAdapter(Context context ,List<?> dataList ,EasyListView sonListView){
        mContext = context;
        mSonListView = sonListView;
        mItemLayoutId = mSonListView.getListViewItemLayoutId();
        MyAdapter myAdapter = new MyAdapter(context , dataList);
        return myAdapter;
    }
    //List的适配器
    protected class MyAdapter extends BaseAdapter {
        Context adapterContext;
        private LayoutInflater adapterInflater;//得到一个LayoutInfalter对象用来导入布局
        private List<?> adapterObjectList;

        public MyAdapter(Context myContext , List<?> inputDataList){
            adapterContext = myContext;
            adapterInflater = LayoutInflater.from(myContext);
            adapterObjectList=inputDataList;
        }
        @Override
        public int getCount() {
            return adapterObjectList.size() ;
        }
        @Override
        public Object getItem(int position) {
            return null;
        }
        @Override
        public long getItemId(int position) {
            return 0;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder;
            if(convertView == null){
                //引入list每项的布局
                convertView = adapterInflater.inflate(mItemLayoutId,null);
                viewHolder = new ViewHolder(adapterContext);
                viewHolder.viewGetViewId(convertView);
                convertView.setTag(viewHolder);
            }
            else{
                viewHolder= (ViewHolder) convertView.getTag();
            }
            viewHolder.viewUpdateView(adapterObjectList.get(position));
            return convertView;
        }
        public final class ViewHolder {
            Context viewContext;
            public ViewHolder(Context context) {
                viewContext = context;
            }
            public void viewGetViewId(View convertView) {
                //将申明的组件与布局连接
                mSonListView.getViewId(convertView);
            }
            public void viewUpdateView( Object adapterObject) {
                //给特定的View赋值
                mSonListView.updateView(adapterObject);
            }
        }
    }
}

  基本照抄fooCoder大大的方法,不作赘述。需要说明的是,这是一个抽象类,当我们要新建一个ListView时,我们只需要自己定义一个类,继承它,然后按一定的规则实现方法即可。使用的例子如下:

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import com.memeda.lsy.tomatofight3.R;
import com.memeda.lsy.tomatofight3.data.RecordingData;
import java.util.List;

/**
 * Created by Administrator on 2015/4/4.
 */
public class DownLoadingListView extends EasyListView {
    public DownLoadingListView(Context context) {
        super(context);
    }

    public DownLoadingListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public DownLoadingListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    TextView titleTextView , pathTextView;

    @Override
    protected int getListViewItemLayoutId() {
        return R.layout.download_listview_item_layout;
    }
    @Override
    protected void getViewId(View convertView) {
        titleTextView = (TextView) convertView.findViewById(R.id.downloadAmrTitle);
        pathTextView = (TextView) convertView.findViewById(R.id.downloadAmrAuthor);
    }
    @Override
    protected void updateView(Object dataObject) {
        RecordingData recordingData = (RecordingData) dataObject;
        titleTextView.setText(recordingData.getRecordingName());
        pathTextView.setText("作者:"+recordingData.getUserName());
    }

    @Override
    public void updateListView(Context context, List<?> inputDataList) {
        MyAdapter myAdapter = getAdapter(context , inputDataList , this);
        setAdapter(myAdapter);
    }
}

  使用步骤如下:

  一、声明Item中的组件。  

TextView titleTextView , pathTextView;

  二、获得ListView的Item的布局文件(XML)。

@Override
    protected int getListViewItemLayoutId() {
        return R.layout.download_listview_item_layout;
    }

  三、获得Item中的组件的实例。

@Override
    protected void getViewId(View convertView) {
        titleTextView = (TextView) convertView.findViewById(R.id.downloadAmrTitle);
        pathTextView = (TextView) convertView.findViewById(R.id.downloadAmrAuthor);
    }

  四、设置ListView的生成/更新时,数据与组件显示的对应关系。  

@Override
    protected void updateView(Object dataObject) {
        RecordingData recordingData = (RecordingData) dataObject;
        titleTextView.setText(recordingData.getRecordingName());
        pathTextView.setText("作者:"+recordingData.getUserName());
    }

  五、实现ListView的更新方法。 

@Override
    public void updateListView(Context context, List<?> inputDataList) {
        MyAdapter myAdapter = getAdapter(context , inputDataList , this);
        setAdapter(myAdapter);
    } 

  六、在Activity中使用它,像通常的ListView一样

internetRecordListView.updateListView(this,recordingDatas);

以上。

 

  

时间: 2024-12-19 23:17:00

关于ListView的优化的相关文章

Android ListView性能优化实战方案

前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListView进行性能优化,不仅是面试中常常会被问到的(我前段时间面试了几家公司,全部都问到了这个问题了),而且在实际项目中更是非常重要的一环,它甚至在某种程度上决定了用户是否喜欢接受你的APP.(如果你的列表滑起来很卡,我敢说很多人会直接卸载) 网上关于如何对ListView进行性能优化,提出了很多方案.但

ListView 性能优化------使用ViewHolder,修改layout_weight属性为“match_parent”

转载自:http://blog.csdn.net/pkxiuluo01/article/details/7380860 Adapter是ListView界面与数据之间的桥梁,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View.如果列表中有很多的项时会占用极大的系统资源,所以我们需要优化Adapter 1.convertView的使用 [java] view plaincopy Java代码 public View getView(int position, 

Android ListView使用BaseAdapter与ListView的优化 (转至 http://www.open-open.com/lib/view/open1339485728006.html)

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖.这时候最方便的方法就是使用灵活的适配器BaseAdapter了. ▲图4-35 BaseAdapter中的方法 使用BaseAdapter必须写一

Android ListView使用BaseAdapter与ListView的优化

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖.这时候最方便的方法就是使用灵活的适配器BaseAdapter了. ▲图4-35 BaseAdapter中的方法 使用BaseAdapter必须写一

ListView 的优化和优化原理

列表的显示需要三个元素: ListVeiw:  用来展示列表的View. 适配器 : 用来把数据映射到ListView上 数据:    具体的将被映射的字符串,图片,或者基本组件.             根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,这三种适配器的使用大家可学习下官网上面的使用或者自行百度谷歌,一堆DEMO!!!其中以ArrayAdapter最为简单,只能展示一行字.SimpleAdapter有

Android ListView 的优化

一.复用convertView,降低findViewById的次数 1.优化一:复用convertView Android系统本身为我们考虑了ListView的优化问题.在复写的Adapter的类中,比較重要的两个方法是getCount()和getView().界面上有多少个条显示.就会调用多少次的getView()方法:因此假设在每次调用的时候,假设不进行优化.每次都会使用View.inflate(-.)的方法,都要将xml文件解析,并显示到界面上,这是很消耗资源的:由于有新的内容产生就会有旧

ListView常用优化技巧(Android群英传)

内容是博主照着书敲出来的,博主码字挺辛苦的,转载请注明出处,后序内容陆续会码出. 前言:ListView--列表,它作为一个非常重要的显示方式,不管是在Web中还是移动平台中,都是一个非常好的.不开或缺的展示信息的工具.在Android中,ListView控件接管了这一重担,在大量的场合下,我们都需要使用这个控件.虽然在Android 5.X时代,RecyclerView在很多地方都在逐渐取代ListView,但ListView的使用范围依然非常的广泛,它这万年老大哥的地位也不是轻易就能撼动的.

Android Listview 性能优化

首先我一般使用的适配器是BaseAdapter,其中有两个方法最主要,分别是: getCount,getView, 在对Listview 进行优化的时候,首先使用 convertview 和viewHolder 配合进行优化,使用convertview的母的是 控件复用,从而加到减少内存的使用,使用viewHolder 的是减少findbyid 的次数. 但是在进行控件以后,在进行图片加载的时候,会出现图片错位的问题,这是因为控件里面有上次残留的图片在里面,所以我们在初始化的时候需要设置一张默认

Android之ListView性能优化——万能适配器

如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有觉得有什么不好的.直到最近在慕课网上看到鸿洋大神讲的“机器人小慕”和“万能适配器”两节课,才对BaseAdapter有所了解.看了鸿洋大神的课程之后,我又上网搜了几个博客,也看了一些源码和文档,于是打算写一个帖子来记录一下自己的学习历程. 在今天的帖子中,我们从一个最基本的实现BaseAdapter

BaseAdapter以及对ListView的优化(转)

背景 对于ListView.GridView.Gallery.Spinner等等,它是它们的适配器,直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方法,其中最重要的当属getView,因为这会涉及到ListView优化等问题,BaseAdapter与其他Adapter有些不一样,其他的Adapter可以直接在其构造方法中进行数据的设置: SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layou