ListView的优化尝试

  在Android开发中,ListView被大量使用,ListView需要的情况多种多样。有时只需要简单的文字列表,有时需要将一个比较复杂的布局作为Item的内容,有时甚至需要不同类型,不同布局的内容交错排布在ListView中。按照通常的ListView优化策略会使用convertView和viewHolder来重用Item提升ListView的效率。但是,这样每一个布局不同的ListView我可能都需要写一个新的Adapter。如果还要在一个ListView中显示不同的布局则可能会产生大量的重复代码。因此,在这里我想换一个思路,暂时还没有经过足够的实践检验,它有可能是错的,我只是在此记录一下思路。

  首先,每个ListView的Adapter真正需要输入的是什么?其实只有两个,一个是布局,一个是数据。Adapter的工作就是连接两者。因此,我希望Adapter中只有连接的内容。布局怎么实现,应该在布局中去写(因为可能有多种布局混在一个ListView中)。

  接下来,数据的类型是未知的,我们只知道它应该是个List,然后List中包含了什么,我们不需要知道,每个布局去List里面找自己需要的东西就好了。

  然后,每个布局都应该有一些公有的,必须实现的方法。比如:加载布局文件、获取布局中的控件、提取数据中的信息更新布局。

  最后,Adapter只需要在getView中告诉布局,你现在去取数据List中第positon个数据来更新布局就可以了。

  下面是代码

  布局类

  BaseAdapterViewHolder:

public abstract class BaseAdapterViewHolder {
    Context mContext;
    List<?> mDataList;
    View mConvertView;
    public BaseAdapterViewHolder(Context context , List<?> dataList , int convertViewId ){
        mContext = context;
        mDataList = dataList;
        mConvertView = LayoutInflater.from(context).inflate(convertViewId , null);
    }
public View getConvertView(){
        return mConvertView;
    }

    abstract public void getItemChildView(View convertview);

    abstract public void setItemChlidView(int position);
}

   这个类是个虚拟类,在此记当一个子类的实现例子

public class DoufuItem2Data  extends BaseAdapterViewHolder implements View.OnClickListener {
    ImageView userImage;
    TextView itemState;
    TextView itemUpdateTime;
    int mPositon;

    public DoufuItem2Data(Context context, List<?> dataList) {
        super(context, dataList, R.layout.doufu_itemview_test);
    }

    public void getItemChildView(View mConvertView) {
        userImage = (ImageView) mConvertView.findViewById(R.id.doufu_item_user_image);
        itemState = (TextView) mConvertView.findViewById(R.id.doufu_item_state);
        itemUpdateTime = (TextView) mConvertView.findViewById(R.id.doufu_item_update_time);
    }

    public void setItemChlidView(int position) {
        mPositon = position;
        itemState.setText("完结" + mPositon);
        itemUpdateTime.setText("更新 刚刚");
        userImage.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Toast.makeText(mContext, mDataList.get(mPositon).toString() + mPositon, Toast.LENGTH_SHORT).show();
    }
}

  最后,附上这个布局类的Adapter中的使用方法:

public class DoufuFragmentListAdapter extends BaseAdapter {
    private Context mContext;
    private List<?> mDataList;

    public DoufuFragmentListAdapter(Context context , List<?> dataList) {
        mContext = context;
        mDataList = dataList;
    }

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

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

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

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        BaseAdapterViewHolder viewHolder;
        if(convertView == null){
            viewHolder = new DoufuItem2Data(mContext , mDataList);
            convertView = viewHolder.getConvertView();
            viewHolder.getItemChildView(convertView);
            convertView.setTag(viewHolder);
        }
        else{
            viewHolder = (DoufuItem2Data) convertView.getTag();
        }
        viewHolder.setItemChlidView(position);
        return convertView;
    }

}

  当我们需要使用不同的布局时,我们只需要将viewHolder = new DoufuItem2Data(mContext , mDataList);换成别的布局类即可。

  Done!

时间: 2024-10-11 00:53:26

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