对于优化,一般要多使用内部类,静态方法,少使用get set方法。对于listview列表的优化一般有如下两种方法:

1、若数据不多的时候,直接复用历史缓存,和静态的ViewHolder类。

1.1获得布局中的listview对象

lv_start_gps_info_collect=(ListView) findViewById(R.id.lv_start_gps_info_collect);

1.2一般listview都用BaseAdapter子类做数据适配器。

/**

* 终端GPS数据信息数据适配器

* @author yqq

*

*/

private class GpsDeviceInfoAdapter extends BaseAdapter{

List<TouristInfo> infos=null;

public GpsDeviceInfoAdapter(List<TouristInfo>infoTemp){

infos=infoTemp;

}

@Override

public int getCount() {

// TODO Auto-generated method stub

return infos.size();

}

@Override

public Object getItem(int position) {

// TODO Auto-generated method stub

return infos.get(position);

}

@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View view=null;

ViewHolder holder=null;

if(convertView!=null&&convertView instanceof LinearLayout ){

view=convertView;

holder=(ViewHolder)view.getTag();

}else{

holder=new ViewHolder();

view=View.inflate(EndDeviceOnGPS.this,R.layout.show_device_info_item,null);

holder.name=(TextView) view.findViewById(R.id.tv_device_name);

holder.addr=(TextView) view.findViewById(R.id.tv_device_mac_addr);

view.setTag(holder);

}

holder.name.setText("姓名:"+infos.get(position).getName());

holder.addr.setText("手机号码:"+infos.get(position).getPhoneNumber());

return view;

}

}

static class ViewHolder{

TextView name;

TextView addr;

}

其中 每项显示的布局如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:descendantFocusability="blocksDescendants"

android:background="@drawable/deceive_info_item_selector"

android:orientation="vertical" >

<LinearLayout

android:layout_marginTop="5dp"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical"

>

<TextView

android:id="@+id/tv_device_name"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="设备名:"

android:textSize="20sp" />

<TextView

android:layout_marginTop="5dp"

android:id="@+id/tv_device_mac_addr"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="Mac地址:"

android:textColor="#000000"

android:textSize="18sp" />

</LinearLayout>

<View

android:layout_width="match_parent"

android:layout_height="1dp"

android:background="@android:color/holo_blue_bright" />

</LinearLayout>

</LinearLayout>

1.3通过异步任务来刷新数据实现在加载数据时候是一个进度提示,加载完毕后才显示数据的界面,类似微信的界面首次跳转效果;

/**

* 异步任务给列表加载数据

*/

private void fillData(){

new AsyncTask<Void,Void,Void>(){

@Override

protected void onPreExecute() {

loading.setVisibility(View.VISIBLE);

super.onPreExecute();

}

@Override

protected void onPostExecute(Void result) {

loading.setVisibility(View.INVISIBLE);

//刷新界面列表数据

if(mAdapter==null){

mAdapter=new RubishSmsInfosAdapter();

mRubishSms.setAdapter(mAdapter);

}else{

mAdapter.notifyDataSetChanged();

}

super.onPostExecute(result);

}

@Override

protected Void doInBackground(Void... params) {

if(mInfos==null){

mInfos=mRubishSmsInfoDao.findInfosbyPage(maxNum, offset);

}else{

mInfos.addAll(mRubishSmsInfoDao.findInfosbyPage(maxNum, offset));

}

try {

Thread.sleep(1500);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

}.execute();

}

整体界面布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

<FrameLayout

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_weight="100" >

<LinearLayout

android:layout_gravity="center"

android:id="@+id/ll_rublish_sms_info_loading"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical"

android:visibility="invisible" >

<ProgressBar

android:layout_width="match_parent"

android:layout_height="wrap_content" />

<TextView

android:gravity="center"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="数据加载中,请稍后..."

android:textSize="13sp" />

</LinearLayout>

</FrameLayout>

<ListView

android:id="@+id/lv_rubish_sms_content"

android:layout_width="match_parent"

android:layout_height="match_parent" >

</ListView>

</LinearLayout>

2、列表展示数据太多,分页加载

public class RubishSmsActivity extends Activity {

private ListView mRubishSms;//显示垃圾短信的列表

private List<RubishSmsInfo> mInfos;//垃圾短信信息

private RubishSmsInfosAdapter mAdapter;//垃圾短信信息适配器

private int maxNum=5;//分页加载每页的最大数目

private int offset=0;//偏移

private int totalNums;//垃圾短信的总数目

private RubishSmsInfoDao mRubishSmsInfoDao;//垃圾短信信息的数据库表操作对象

private View loading;//数据加载提示

//private View m_view;//对垃圾短信的操作对话框布局

public RubishSmsActivity() {

}

@Override

protected void onCreate(Bundle savedInstanceState) {

init();

setListener();

super.onCreate(savedInstanceState);

}

private void init() {

setContentView(R.layout.activity_rubish_sms);

mRubishSms=(ListView) findViewById(R.id.lv_rubish_sms_content);

mRubishSmsInfoDao=new RubishSmsInfoDao(getApplicationContext());

totalNums=mRubishSmsInfoDao.getMaxCount();

loading=findViewById(R.id.ll_rublish_sms_info_loading);

}

/**

* 设置监听事件

*/

private void setListener(){

//下拉列表的时候分页加载数据

mRubishSms.setOnScrollListener(new OnScrollListener() {

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

switch (scrollState) {

//在下拉列表空闲的时候显示数据

case OnScrollListener.SCROLL_STATE_IDLE:

//获得分页加载的每页最大值

int position=mRubishSms.getLastVisiblePosition();

int total=0;

if(mInfos!=null){

// total=maxNum;

total=mInfos.size();

}

if(position==total-1){

//到达该分页加载的末尾位置

offset+=maxNum;

if(offset>totalNums){

Toast.makeText(RubishSmsActivity.this,"数据已经加载完,没有更多的数据了...", 300).show();

return;

}

//异步任务加载数据

fillData();

}

break;

}

}

@Override

public void onScroll(AbsListView view, int firstVisibleItem,

int visibleItemCount, int totalItemCount) {

// TODO Auto-generated method stub

}

});

fillData();

//每个条目绑定监听

mRubishSms.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

//获得条目对应的每个对象

Object object=mRubishSms.getItemAtPosition(position);

if(object instanceof RubishSmsInfo){

final RubishSmsInfo info=(RubishSmsInfo) object;

View m_view=View.inflate(RubishSmsActivity.this,R.layout.show_rubish_sms_operation,null);

//对对象的操作1、删除2、恢复到收件箱3、加入黑名单

Dialog builder=new Dialog(RubishSmsActivity.this);

builder.setTitle("提示");

builder.setContentView(m_view);

//删除

((TextView)m_view.findViewById(R.id.tv_delete)).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if(mInfos==null||!mInfos.contains(info)){

Toast.makeText(RubishSmsActivity.this,"没有数据!",200).show();

return;

}

mInfos.remove(info);

if(mRubishSmsInfoDao==null){

mRubishSmsInfoDao=new RubishSmsInfoDao(getApplicationContext());

}

mRubishSmsInfoDao.deleteSmsInfos(info);

if(mAdapter==null){

mAdapter=new RubishSmsInfosAdapter();

mRubishSms.setAdapter(mAdapter);

}else{

mAdapter.notifyDataSetChanged();

}

}

});

//恢复到收件箱

((TextView)m_view.findViewById(R.id.tv_recovery_sms)).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//刷新界面

if(mInfos==null||!mInfos.contains(info)){

Toast.makeText(getApplicationContext(),"没有数据了!",300).show();

return;

}

new AsyncTask<Void,Void,Void>(){

boolean flag=false;

@Override

protected Void doInBackground(Void... params) {

SmsInboxProvider provider=new SmsInboxProvider(getApplicationContext());

flag=provider.recoverySmsToInbox(info);

return null;

}

@Override

protected void onPostExecute(Void result) {

if(flag){

Toast.makeText(getApplicationContext(),"恢复到收件箱成功!",300).show();

mInfos.remove(info);

if(mRubishSmsInfoDao==null){

mRubishSmsInfoDao=new RubishSmsInfoDao(getApplicationContext());

}

mRubishSmsInfoDao.deleteSmsInfos(info);

if(mAdapter==null){

mAdapter=new RubishSmsInfosAdapter();

mRubishSms.setAdapter(mAdapter);

}else{

mAdapter.notifyDataSetChanged();

}

}else{

Toast.makeText(getApplicationContext(),"恢复到收件箱失败!",300).show();

}

super.onPostExecute(result);

}

}.execute();

}

});

//加入黑名单

((TextView)m_view.findViewById(R.id.tv_add_black_number)).setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

//异步任务把黑名单添加到黑名单数据表里

new AsyncTask<Void,Void,Void>(){

boolean flag=false;

@Override

protected Void doInBackground(Void... params) {

BlackNumberDao blackNumberDao=new BlackNumberDao(getApplicationContext());

flag=blackNumberDao.addBlackNumber(info.getPhoneNumber());

return null;

}

@Override

protected void onPostExecute(Void result) {

if(flag==true){

Toast.makeText(RubishSmsActivity.this,"添加黑名单成功!",300).show();

}else{

Toast.makeText(RubishSmsActivity.this,"已经添加到黑名单!",300).show();

}

super.onPostExecute(result);

}

}.execute();

}

});

builder.show();

}

}

});

}

/**

* 异步任务给列表加载数据

*/

private void fillData(){

new AsyncTask<Void,Void,Void>(){

@Override

protected void onPreExecute() {

loading.setVisibility(View.VISIBLE);

super.onPreExecute();

}

@Override

protected void onPostExecute(Void result) {

loading.setVisibility(View.INVISIBLE);

//刷新界面列表数据

if(mAdapter==null){

mAdapter=new RubishSmsInfosAdapter();

mRubishSms.setAdapter(mAdapter);

}else{

mAdapter.notifyDataSetChanged();

}

super.onPostExecute(result);

}

@Override

protected Void doInBackground(Void... params) {

if(mInfos==null){

mInfos=mRubishSmsInfoDao.findInfosbyPage(maxNum, offset);

}else{

mInfos.addAll(mRubishSmsInfoDao.findInfosbyPage(maxNum, offset));

}

try {

Thread.sleep(1500);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

}.execute();

}

/**

* 垃圾短信显示的数据适配器

* @author yqq

*

*/

private class RubishSmsInfosAdapter extends BaseAdapter{

@Override

public int getCount() {

return mInfos.size();

}

@Override

public Object getItem(int position) {

// TODO Auto-generated method stub

return mInfos.get(position);

}

@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View view=null;

ViewHolder holder=null;

if(convertView!=null&& convertView instanceof LinearLayout){

view=convertView;

holder=(ViewHolder) view.getTag();

}else{

holder=new ViewHolder();

view=View.inflate(RubishSmsActivity.this,R.layout.rubish_sms_info_item,null);

holder.tvPhoneNumber=(TextView) view.findViewById(R.id.tv_phone_number);

//holder.tvDate=(TextView) view.findViewById(R.id.tv_received_date);

holder.tvContent=(TextView) view.findViewById(R.id.tv_rubish_sms_content);

view.setTag(holder);

}

holder.tvPhoneNumber.setText("电话号码:"+mInfos.get(position).getPhoneNumber());

//holder.tvDate.setText(mInfos.get(position).getReceivedDate());

holder.tvContent.setText("短信内容:"+mInfos.get(position).getSmsContent());

return view;

}

}

static class ViewHolder{

TextView tvPhoneNumber;//电话号码显示

//TextView tvDate;//日期显示

TextView tvContent;//短信内容显示

}

}

android listView的优化方法相关推荐

  1. Android ListView 的优化

    一.复用convertView.降低findViewById的次数 1.优化一:复用convertView Android系统本身为我们考虑了ListView的优化问题,在复写的Adapter的类中. ...

  2. Android ListView性能优化实例讲解

    前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...

  3. Android Listview 性能优化

    首先我一般使用的适配器是BaseAdapter,其中有两个方法最主要,分别是: getCount,getView, 在对Listview 进行优化的时候,首先使用 convertview 和viewH ...

  4. [Android]ListView性能优化之视图缓存

    前言 ListView是Android中最常用的控件,通过适配器来进行数据适配然后显示出来,而其性能是个很值得研究的话题.本文与你一起探讨Google I/O提供的优化Adapter方案,欢迎大家交流 ...

  5. android全方位性能优化方法

    1,布局优化 布局优化的思想很简单,就是尽量减少布局文件的层级,布局中的层级少了,这就意味着Android绘制时的工作量少了,那么程序的性能自然就高了. 那么如何进行布局优化呢?有以下两点: •首先删 ...

  6. (翻译) Android ListView 性能优化指南

    本文翻译了Lucas Rocha的Performance Tips for Android's ListView.这是一篇关于介绍如何提升ListView性能的文章,非常的优秀.使得我拜读之后,忍不住 ...

  7. Android Studio Gradle优化方法

    第一步:打开AS安装所在的位置,用记事本打开"红色框"选中的文件. 如图: 第二步:打开"studio64.exe.vmoptions"文件后修改里面的值,修改 ...

  8. Android App性能优化之内存优化

    为什么要进行内存优化? 1.App运行内存限制,OOM导致App崩溃 2.App性能:流畅性.响应速度和用户体验 Android的内存管理方式 Android系统内存分配与回收方式 ●   一个App ...

  9. ym——Android之ListView性能优化

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android之ListView性能优化 假设有看过我写过的15k面试题的朋友们一定知 ...

最新文章

  1. Get了!用Python制作数据预测集成工具 | 附代码
  2. 【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | Class.cpp#findClassNoInit 函数 | DexFile.cpp#dexFindClass 函数分析 )
  3. Bellman_Ford算法
  4. 高度平衡树 -- AVL 树
  5. 【通俗讲解】BP神经网络
  6. 前端导出文件,后端返回文件流过大直接干崩溃
  7. matlab两张图片合成一张_11. 图像合成与图像融合
  8. 五、Hashtable与HashMap的区别
  9. SPAW Editor .NET Edition v.2乱用:使用代码调整编辑器高度
  10. Elasticsearch高级查询2:ES 高级查询
  11. 聚集索引,非聚集索引的区别是什么
  12. WWDC 2015大会到来了
  13. CAD迷你看图V9.5版
  14. OpenCV—播放AVI视频
  15. css3 图片旋转360度动画
  16. 用python画字母b_用Python 画个多啦A梦,小猪佩奇
  17. python调用大漠插件寻路_python怎么调用大漠?
  18. 数组的归一化c语言,如何归一化频率数组
  19. Github每日精选(第77期):Go (Golang) 编写的 HTTP Web 框架gin
  20. 也议:程序员想要什么样的上司

热门文章

  1. ns3 lalala
  2. 26万奖金 | 第一届 E-MapReduce 极客挑战赛 诚邀英才前来挑战!
  3. 【2021 arXiv机器学习论文精选】
  4. 动态左侧二级下拉菜单 基于bootstrap js
  5. ScanNet数据集讲解与点云数据下载
  6. 一款魔兽盗号木马分析
  7. 淘宝AR直播功能上线,看阿里如何玩转虚拟购物
  8. Windows驱动学习(八)-- 通过InlineHook实现变速齿轮
  9. 爱因斯坦谜题的真正答案
  10. 快递查询软件,快递发货后中途被退回的单号物流信息怎么批量查询