如何优化listview

 我来答
成都妇科林岚医生
2021-03-24 · 川北医学院附属成都新华医院您的健康最重要
成都妇科林岚医生
川北医学院附属成都新华医院坐落于成都市成华区中心城区,始建于1958年,前身为成都市新华人民医院。全院开设31个临床科室、8个医技科室,创建ERCP专家工作室、呼吸与危重症诊治中心等重点科室
向TA提问
展开全部
一:概要
众所周知,在开发过程中,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 List<Coupon> list = new ArrayList<Coupon>();
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(List<Coupon> list) {
this.list.addAll(list);
notifyDataSetChanged();
}

// 清空
public void clear() {
list.clear(  https://tijian.scykxy.cn#);
notifyDataSetChanged();
}
}
</span>

第四点:

分页加载数据,这样获取的数据会比较少,对网络依赖较少,可以很快完成,加载速度很快
第五点:

对ListView做滚动事件处理,当ListView在滚动的过程中,不去加载网络图片,等滚动结束,在加载图片
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式