Android 复杂布局的ListView优化思路

项目中用到一个内部复杂布局的listview,每个item中都有动态的子item,相当于listview的item中还有listview的样式。刚开始做的思路是,用一个listview,然后item中加个LinearLayout,然后代码动态的生成子item view 添加在其中,希望这样的表述大家能明白,按照这样的思路做好之后发现快速滑动的时候,一卡一顿,实在不能直视,在配置低点的机器上更是不能看。

但是因为赶进度一直没有优化,现在回头看下,虽然已经用了viewHolder但是listview缓冲的机制完全没有发挥作用,因为每个item show的时候都需要removeAll 子item,然后再添加一遍,绘制的时间太长,造成了卡顿。

怎么解决这个问题尼?

刚好google在support v7推出了recyclerView,有着更好的缓存优化机制,我如获救星,赶紧将listview换成了recyclerView,但是效果不尽人意,没有我想象中的效率提升,仔细想了想,recycleView只是针对listView的多type情况做了优化,而实际需求中还是在item中动态的生成item,没有用到recyclerView的优势。

那么自然下面想到的就是干掉动态生成的Item部分,把数据拆分成一个一个的listview item。但是又担心这样的工作量会不会很大,实际抽象过程中发现很容易,就把原来一个model数据拆分成了7个不同类型的model,getView的时候先通过postion 获取当前model的type,然后返回不同的View item,很简单的就把原来只有一种item的listview拆分成了一个有7种类型Item的listView。跑起来之后,速度哗哗的,感觉就更一个item的一样。

listView支持多种类型的Item时候还有个坑:继承BaseAdapter的时候必须复写下面两个方法

//滑动ListView的时候,第一个item消失之后,进入屏幕的item类型必须通过<span style="font-family: Arial, Helvetica, sans-serif;">getItemViewType符合类型才会被复用,否则创建新的item类型,当然这些的前提是你必须使用了listView的缓存tag</span>
    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }
//默认这个方法返回1,所有有几种类型必须告诉listView,listView就会创建几个不同类型的队列
    @Override
    public int getViewTypeCount() {
        return super.getViewTypeCount();
    }

这个时候,既然动态生成子item的机制已经被干掉了,我又想到了recyclerView,如果用recyclerView会不会比ListView更优尼?说干就干,10分钟我已经完成了替换(思路有了我搬砖的效率还是很快的),跑起来之后,果然唰唰的(其实肉眼已经很难分辨出来和listView的区别了)。但是跟着google走应该不会错,他自己说的:

The RecyclerView widget
is a more advanced and flexible version of ListView.
This widget is a container for displaying large data sets that can be scrolled very efficiently by maintaining a limited number of views. Use the RecyclerViewwidget
when you have data collections whose elements change at runtime based on user action or network events.

希望能帮助到有类似需求的同学:

ListView中有复杂布局,尤其是有动态生成的布局的子布局的,可以考虑一下将原来的Item拆分成不同的类型,然后使用recyclerView。

时间: 2024-10-08 06:11:18

Android 复杂布局的ListView优化思路的相关文章

【转】Android自定义Adapter的ListView的思路及代码

原文网址:http://www.jb51.net/article/37236.htm Android自定义Adapter的ListView的思路及代码,需要的朋友可以参考一下 在开发中,我们经常使用到ListView这个控件.Android的API也提供了许多创建ListView适配器的快捷方式.例如ArrayAdapter.SimpleAdapter和SimpleCursorAdapter等.但你是否发现,如果采用这些系统自带的适配器,对于事件的响应只能局限在一个行单位.假设一行里面有一个按钮

android样式布局---&amp;gt;ListView(附上源代码)

在android应用开发过程中,Listview 是经常使用的数据展现控件,往往用于显示列表形式的数据. 假设只显示数据往往会显得非常单调.非常多时候依据须要定义不同的item 背景选项.比如定义数据的标题.表头或者间隔显示Listview item背景内容. 如图的所看到的的背景内容,如今以一个WeatherDemo为模型分析Listview的相关用法. 实现思路:定义Listview不同的背景,首先要定义好标题与表格内容的两个不同的xml布局文件(city_item.xml,content_

ListView优化 思路及原理

最佳实践 1.将[内部类]用 static修饰一下.public static class ViewHolder { } 2.将实例mViewHolder作为外部类的成员变量.private ViewHolder mViewHolder; 注解: ViewHolder是否用static修饰,结果都是一样的,效率也没什么提升,不过大家都习惯用 static修饰一下. 一种情况下可以将mViewHolder作为局部变量,那就是想[临时]操作屏幕上item中的控件,这时屏幕上的mViewHolder和

Android加载数据ListView优化内存实现

问题分析 在移动端项目开发中,基于加载大数据量的原因,经常出现内存溢出的现象,那么减少内存占用,在真实开发中着实很重要,下面介绍下ListView加载数据量大时解决思路: 我们应该碰到过这样的情况,对于加载的listview,我们慢慢滑动数据时,系统加载数据没有问题,但是当加快滑动数据时,就会出现内存溢出的问题(这里不考虑分页加载方法).总结这是因为手机屏幕显示的原因,每次加载数据是有限的,慢慢滑动数据,在加载数据的同时,系统能有时间回收不用的内存,才不会暴露问题,但是,加快滑动,内存回收GC来

Android的布局复用与优化

在布局优化中,Android的官方提到了这三种布局<include />.<merge />.<ViewStub />,并介绍了这三种布局各有的优势,下面也是简单说一下怎么使用. 1.布局重用<include /> <include />标签能够重用布局文件,简单的使用如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

Android之——ListView优化

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47209253 作为客户端,其最主要的任务就是最直观的和用户交互.从服务器拿数据,解析过后显示数据,根据用户操作按照一定的协议传回数据,达到用户想要的结果.这是我自己的理解,所以我们的程序,必须给用户一个良好的体验. listView可以说是安卓开发中很重要的一个控件.我所做的项目中,几乎每个页面都会有listView.Adapter是listView和数据源间的中间人.当每条数据

Android ListView优化篇

在我的上一篇博客<Android ListView基础篇>中陈列了ListView和adapter的多种结合方式的基本使用,在本篇文章中将具体讲述如何通过多种方式处理好ListView的优化问题. 在上篇文章的例子中,我们使用了一张图片和一个文本作为每一行的数据,发现效果已经完全达到了,而且没出现什么问题.但如果我们将Item的数量调大,比如调到1000.10000.100000条数据,这个时候当你打开ListView的时候,肯定会不禁感慨"什么鬼,卡机了?!"等了好几秒钟

Android 常驻与很驻型广播的差别,及ListView优化,Android新手基本知识巩固

1.常驻型广播 常驻型广播,当你的应用程序关闭了,假设有广播信息来,你写的广播接收器相同的能接受到. 他的注冊方式就是在你的应用程序中的AndroidManifast.xml进行注冊. 通常说这样的方式是静态注冊 以下是配置样例 2<receiver android:name=".widget.DeskWidgeWeather"> 3<meta-data android:name="android.appwidget.provider" andro

Android MaoZhuaWeiBo Adapter ListView优化及发送微博 - 4

这一篇主要给大家说说Adapter ListView优化及发送微博,我们都知道Android在一些比较耗内存的类里,为了尽量避免浪费内 存,我们需要对我们的组件之类的进行优化,使其节约不必要的资源浪费 自定义适配器: package com.neweriweibo.adapter; /** * 适配器 * @author Engineer-Jsp * @date 2014.10.28 * */ import java.util.ArrayList; import com.neweriweibo.