listview优化(listview性能优化)
Flutter -Listview 4个优化能让你的列表丝般顺滑
优化点1:使用 builder构建列表
当你的列表元素是动态增长的时候(比如上拉加载更多),请不要直接用children 的方式,一直往children 的数组增加组件,那样会很糟糕。对于 ListView.builder 是按需构建列表元素,也就是只有那些可见得元素才会调用itemBuilder 构建元素,这样对于大列表而言性能开销自然会小很多。
优化点2:禁用 addAutomaticKeepAlives 和 addRepaintBoundaries 特性
这两个属性都是为了优化滚动过程中的用户体验的。
addAutomaticKeepAlives 特性默认是 true,意思是在列表元素不可见后可以保持元素的状态,从而在再次出现在屏幕的时候能够快速构建。这其实是一个拿空间换时间的方法,会造成一定程度得内存开销。可以设置为 false 关闭这一特性。缺点是滑动过快的时候可能会出现短暂的白屏(实际会很少发生)。
addRepaintBoundaries 是将列表元素使用一个重绘边界(Repaint Boundary)包裹,从而使得滚动的时候可以避免重绘。而如果列表很容易绘制(列表元素布局比较简单的情况下)的时候,可以关闭这个特性来提高滚动的流畅度。
优化点3:尽可能将列表元素中不变的组件使用 const 修饰
使用 const 相当于将元素缓存起来实现共用,若列表元素某些部分一直保持不变,那么可以使用 const 修饰。
优化点4:使用 itemExtent 确定列表元素滚动方向的尺寸
对于很多列表,我们在滚动方向上的尺寸是提前可以根据 UI设计稿知道的,如果能够知道的话,那么使用 itemExtent 属性制定列表元素在滚动方向的尺寸,可以提升性能。这是因为,如果不指定的话,在滚动过程中,会需要推算每个元素在滚动方向的尺寸从而消耗计算资源。
Flutter ListView 的4个优化要点,非常实用哦!实际上,这些要点都可以从官网的文档里找出对应得说明。因此,如果遇到了性能问题,除了搜索引擎外,也建议多看看官方的文档。
为什么我的listview背景是黑色的优化问题
要使用android:cacheColorHint="@null" 和android:listSelector="@null" 是listview除去背景色,ListView是常用的显示控件,默认背景是和系统窗口一样的透明色,如果给ListView加上背景图片,或者背景颜色时,滚动时listView会黑掉,原因是,滚动时,列表里面的view重绘时,用的依旧是系统默认的透明色,颜色值为#FF191919,要改变这种情况,只需要调用listView的setCacheColorHint(0),颜色值设置为0,或者xml文件中listView的属性Android:cacheColorHint="#00000000"即可,滚动时,重绘View的时候就不会有背景颜色。android:listSelector="#00000000"进行上面的设置之后,ListView点击item时就没有任何现象了,android:listSelector="@null"不可以实现。自定义listview的时候,当你不使用android:cacheColorHint=“#00000000”会出现下面选中一个空间黑色底色的情况,破坏整体美观度
android listview优化几种写法详细介绍
listview A view that shows items in a vertically scrolling list 。一个显示一个垂直的滚动子项的列表视图 在android开发中,使用listview的地方很多,用它来展现数据,成一个垂直的视图。使用listview是一个标准的适配器模式,用数据--,界面--xml以及适配器--adapter,数据被适配器按照需要的方式展现出来,xml描写了数据如何展现,activity中控制这些活动。 其中使用自定义的adapter,会要重写getView方法,在getView方法产生给用户item的视图以及数据。 见图: 这里有一个优化的地方,就是重用view,这样减少内存消耗,同时加快item加载速度。 在getView中优化的地方,大家想必都非常情况,下面我总结了三种优化的写法,请大家指正。 第一: 重用了convertView,很大程度上的减少了内存的消耗。通过判断convertView是否为null,是的话就需要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。 特点:如果当前的convertView为null,则通过LayoutInflat产生一个view。View Code 第二: 上面的写法会有一个缺点,就是每次在getVIew的时候,都需要重新的findViewById,重新找到控件,然后进行控件的赋值以及事件相应设置。这样其实在做重复的事情,因为的geiview中,其实包含有这些控件,而且这些控件的id还都是一样的,也就是其实只要在view中findViewById一次,后面无需要每次都要findViewById了。 下面给出第二种写法 写发的特点,通常有一个内部类class ViewHolder,这个ViewHolder,用来标识view中一些控件,方便进行一些事件相应操作的设置,比如onClick等等,这样可以不用每次都要findViewById了,减少了性能的消耗。同时重用了convertView,很大程度上的减少了内存的消耗。View Code 第三:
个人觉得这个写法是最舒服的,最舒服的意思是看着代码有一种很爽,看的很清晰。 特点,使用了内部类class ViewHolder、重用了convertView。 区别第二种写法是,使用了一个临时变量View view = convertView,然后修改view,最后返回viewView Code 以上就是集中写法,供新手学习和总结。源代码如下:LisViewTest.zip 根据楼下朋友提供的建议,发现还有优化的地方,最新更新如下: View Code @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; ViewHolder holder ; if (view == null) { view = LayoutInflater.from(context).inflate(R.layout.section_list_item1, null); holder = new ViewHolder(); holder.tv_name = (TextView)view.findViewById(R.id.contact_contactinfoitem_tv_name); holder.tv_phone = (TextView)view.findViewById(R.id.contact_contactinfoitem_tv_phoneNum); view.setTag(holder); } else { holder = (ViewHolder)view.getTag(); } ContactInfo1 confo = contacts.get(position); Log.i("my", "confo "+confo.getContactName()); if (confo != null) {//to set every item's text holder.tv_name.setText(confo.getContactName()); holder.tv_phone.setText(confo.getContact_Phone()); } return view; } font color="\"#0000ff\"" /fontstaticclass ViewHolder { TextView tv_name,tv_phone; } 注意:static class ViewHolder 这里设置ViewHolder 为static,也就是静态的,静态类只会在第一次加载时 会耗费比较长时间,但是后面就可以很好帮助加载,同时保证了内存中只有一个ViewHolder,节省了内存的开销。 非常感谢大家提出建议以及大家的关注!
优化listview 有哪些方法
首先,虽然大家都知道,还是提一下,利用好 convertView 来重用 View,切忌每次 getView() 都新建。ListView 的核心原理就是重用 View。ListView 中有一个回收器,Item 滑出界面的时候 View 会回收到这里,需要显示新的 Item 的时候,就尽量重用回收器里面的 View。
利用好 View Type,例如你的 ListView 中有几个类型的 Item,需要给每个类型创建不同的 View,这样有利于 ListView 的回收,当然类型不能太多;
尽量让 ItemView 的 Layout 层次结构简单,这是所有 Layout 都必须遵循的;
善用自定义 View,自定义 View 可以有效的减小 Layout 的层级,而且对绘制过程可以很好的控制;
尽量能保证 Adapter 的 hasStableIds() 返回 true,这样在 notifyDataSetChanged() 的时候,如果 id 不变,ListView 将不会重新绘制这个 View,达到优化的目的;
每个 Item 不能太高,特别是不要超过屏幕的高度,可以参考 Facebook 的优化方法,把特别复杂的 Item 分解成若干小的 Item
为了保证 ListView 滑动的流畅性,getView() 中要做尽量少的事情,不要有耗时的操作。特别是滑动的时候不要加载图片,停下来再加载
使用 RecycleView 代替。 ListView 每次更新数据都要 notifyDataSetChanged(),有些太暴力了。RecycleView 在性能和可定制性上都有很大的改善,推荐使用。
listview的优化不正确的是
listview的优化不正确的是Item的布局层级越多越好。listview的优化分为两类,布局优化和数据优化,Item的布局层级越多,xml文件解析并显示到界面上,这是非常消耗资源的。
如何优化listview
一:概要
众所周知,在开发过程中,ListView的优化是比较重要的那么,如何去优化呢?
如何ListView的提升效率,好像有很多,其实最主要的就是在于adapter中getView方法的优化,那么如何使的getView优化呢?
第一点:
在getView() 中重用了convertView,很大程度上的减少了内存的消耗。通过判断convertView是否为null,是的话就需
要产生一个视图出来,然后给这个视图数据,最后将这个视图返回给底层,呈献给用户。
第二点:
比如:listview 屏幕显示10条数据,当用户滑动listview的时候,第11条数据出现的时候,第一条数据就会被android本身提供
的 Recycler,将这条item(View)放进RecycleBin(回收站)中,然后显示新视图的时候,从RecycleBin中重复用这个View。就
不会造成每次都要去创建新的View,而节约了大量的资源。
第三点:
自身写一个ViewHolder 类,这个ViewHolder,用来标识view中一些控件,方便进行一些事件相应操作的设置,这样就 不用每次 getView() 的View只要找一次控件就好了,不用每次都去寻找。 代码表示如下:
span style="font-family:Microsoft YaHei;font-size:14px;"package com.x1.tools.adapter;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.x1.tools.Config;
import com.x1.tools.vo.Coupon;
import com.x1.ui.R;
/***
* 优惠卷的适配器
*
* @author zengtao 2015年3月31日 上午9:46:08
*/
@SuppressLint({ "InflateParams", "SimpleDateFormat" })
public class CouponAdapter extends BaseAdapter {
private ListCoupon list = new ArrayListCoupon();
private Context context;
private int[] couponImage = { R.drawable.coupon_image_1,
R.drawable.coupon_image_2 };
private int[] couponRight = { R.drawable.coupon_rightimage };
public CouponAdapter(Context context) {
this.context = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Coupon getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(
R.layout.coupon_item_list, null);
ViewHolder vh = new ViewHolder(convertView);
convertView.setTag(vh);
}
ViewHolder viewHolder = (ViewHolder) convertView.getTag();
viewHolder.fillView(getItem(position));
return convertView;
}
/**
* 内部类实现查找控件和数据的显示,这样可以实现布局和控件只加载一次
*
* @author zengtao 2015年3月31日 下午1:34:00
*/
class ViewHolder {
public ImageView mCouponImage, mCouponRight;
public TextView mCouponMoney, mCouponDisplayMessage, mCouponTime;
public ViewHolder(View view) {
mCouponImage = (ImageView) view.findViewById(R.id.coupon_icon);
mCouponRight = (ImageView) view.findViewById(R.id.coupon_righticon);
mCouponMoney = (TextView) view.findViewById(R.id.coupon_money);
mCouponDisplayMessage = (TextView) view
.findViewById(R.id.coupon_message);
mCouponTime = (TextView) view
.findViewById(R.id.coupon_stime_endtime);
}
public void fillView(Coupon coupon) {
Coupon cou = coupon;
if (cou.getCoupon_bgimage() == 1) {
mCouponImage.setImageResource(couponImage[0]);
} else if (cou.getCoupon_bgimage() == 0) {
mCouponImage.setImageResource(couponImage[1]);
}
if (cou.getCoupon_iconimage() == 0) {
mCouponRight.setImageResource(couponRight[0]);
}
mCouponMoney.setText(cou.getCoupon_money() + "元");
mCouponDisplayMessage.setText(cou.getCoupon_access());
mCouponTime.setText(Config.formatDate(cou.getCoupon_begintime())
+ "至" + Config.formatDate(cou.getCoupon_endtime()));
}
}
// 添加数据
public void addAll(ListCoupon list) {
this.list.addAll(list);
notifyDataSetChanged();
}
// 清空
public void clear() {
list.clear();
notifyDataSetChanged();
}
}
/span
第四点:
分页加载数据,这样获取的数据会比较少,对网络依赖较少,可以很快完成,加载速度很快
第五点:
对ListView做滚动事件处理,当ListView在滚动的过程中,不去加载网络图片,等滚动结束,在加载图片