小小千想和您聊一聊

当前位置: 首页> 技术分享> 移动APP测试-ListView优化之UI优化

移动APP测试-ListView优化之UI优化

  listview条目与条目之间的间隙的分割内容 : android:divider="@android :color/transparent"

  listview条目之间的间隙 : android:paddingTop="5.0dip"

  listview点中的颜色变化 : android:listSelector="@color/transparent"

  如果listview有很多个条目 ,在listview的右边会显示出来一个快速滚动的进度条 :

  android:fastScrollEnabled="true"(listview里面的条目至少要滚动5个屏幕以上)

  android:scrollbarStyle="outsideOverlay"

  android:scrollbars="none"

  footer view

  header view

  快速拖动时候的悬浮提示(window manager)

  数据适配性能优化:

  a.传统方式:

  复用历史缓存的view对象, convertView 减少 采用布局填充器服务 填充布局的次数,达到减少xml->view 操作的次数.

  定义了静态的viewholder 储存了 view对象里面控件的引用, view.setTag() view.getTag(); 减少遍历view对象树状结构的次数.

  b.采用了内存缓存,缓存一些经常使用的数据:

  服务器上的图片,缓存这些图片,(缓存手机的Rom卡,sd卡)利用softreference把图片给缓存到内存里面;

  再比如缓存从数据库中查询出的所有数据,减少查询数据库的动作

  c.高级需求:

  listview的延时加载:

  如果listview里面要显示的有很多的数据, 我们不需要一次把所有的数据都获取出来.

  分段的方式 一段一段的把数据下载下来.

  注册listview的 onScrollListener(); 发现最后一个可见的条目为listview里面数据适配器里面的最后的一个条目, 加载更多的内容. listview的分页显示:

  服务器需要提供接口, 一次获取一段的数据.

  数据库提供接口 ,一次查询一段的数据.

  listview的快速拖动的问题:

  当listview在滚动状态下,不去加载listview里面真实的图片和内容,而是把一个缩略图加载界面上.

  当listview的滚动状态停止的时候 才去真正的更新里面的条目的内容.

  如何让你的ListView实现自动滚动呢? Android其实已经考虑到ListView控件的智能滚动操作。

  直接在Layout中写即可,注意下面的stackFromBottom以及transcriptMode这两个属性。涉及代码如下:

	<ListView
		android:id="listCWJ" 
		android:layout_width="fill_parent"
		android:layout_height="fill_parent"
		android:stackFromBottom="true"
		android:transcriptMode="alwaysScroll" />

复用历史缓存的view对象 convertView ,定义了静态的viewholder 储存了 view对象里面控件的引用,以下为代码:
	下面为显示每条数据的xml文件:
	<LinearLayout 
		xmlns:android="http://schemas.android.com/apk/res/android"
		android:orientation="horizontal"> 
	<ImageView 
		android:id="@+id/icon"
		android:layout_width="48dip"
		android:layout_height="48dip" />
	<TextView 
		android:id="@+id/text"
		android:layout_gravity="center_vertical"
		android:layout_width="0dip"
		android:layout_weight="1.0"
		android:layout_height="wrap_content" />
	</LinearLayout>

	Adapter中getView方法代码:
		
static class ViewHolder{
		TextView text;
		ImageView icon;
	}

	public View getView(int position, View convertView, ViewGroup parent){ 
		ViewHolder holder; 
		if (convertView == null) {
			convertView = mInflater.inflate(R.layout.list_item, null); 
			holder = new ViewHolder(); 
			holder.text = (TextView)convertView.findViewButId(R.id.icon));
			holder.icon =(ImageView)convertView.findViewButId(R.id.icon));
			convertView.setTag(holder); 
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		
		holder.text.setText(DATA[position]);
		holder.icon.setImageBitmap((pos & 1) == 1 ? mIcon1 :mIcon2);
		return  convertView; 
	}

  ListView调用Adapter的getView方法获取每一个Item布局,将这些已经获得的Item布局放入缓存,不仅可以提高程序的反应速度,而且可以节省许多流量,将数据进行缓存有两种方法是:一种是将sd卡缓存,另一种是内存缓存,在此分别进行演示。

  sd卡缓存:

  sd卡缓存是将下载的数据保存到sd卡中,当需要再次使用数据时,就先判断sd卡中是否存在这些数据,如果存在的话,就直接从sd卡中读取,如果不存在的话就从网上下载,然后保存到sd卡中。

  内存缓存:

  内 存优化是将获取到的数据存入到Map集合中,如果再次引用此数据,就直接从Map集合中获取,这样会导致一个问题,如果Map集合中的数据特别多,比如存 取了100万条数据,这样有可能就会导致内存溢出。这是因为Map集合是强引用的集合,如何不把Map集合置为空的话,这个集合Java虚拟机就不会把它 回收掉,当Map中的数据大小超过了内存大小就会导致内存溢出。为了避免这种异常我们要使用软引用softreference,软引用和强引用的区别如 下:

  1、softreference 他是java虚拟机给我们提供的一个包装类型。

  在包装类型里面的对象,一般情况下,java虚拟机会尽量长时间的保留这个对象。

  当java虚拟机内存不足的时候,java虚拟机就会回收softreference里面的对象。

  2、hardreference 默认new出来的对象都是这种强应用的类型。

  只要一个对象还保留的有引用,他就不会被垃圾回收。

Map<String,Bitmap> map;


上一篇:HTML5工具初识之网页编辑器

下一篇:菜鸟Vue学习笔记(五)

QQ技术交流群

千锋软件测试官方①群
858327674

加入群聊