Android 使用Listview的优化

Listview是Android中很重要的一个组件,在开发过程中使用到的Listview能站到30%,在新手开发过程中,往往会忽略对Listview的优化,在上一个项目的开发中,确实用到了很多Listview,但是没有这些Listview做过优化,软件在运行过程中会很占内存,肯定也包括这部分的原因了。所以在开发过程中要注重对Listview的优化。

现在测试一个BaseAdapter这个适配器下的优化。在主布局里面放置一个Listview。每一个item的布局文件如下



没有经过优化的实现:

package com.example.baseadaptertest;import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;public class MainActivity extends Activity {private ListView listview;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listview = (ListView) findViewById(R.id.listview);listview.setAdapter(new MyBaseAdapter());}class MyBaseAdapter extends BaseAdapter{/*** 返回有多少列表项* */@Overridepublic int getCount() {// TODO Auto-generated method stubreturn 20;}@Overridepublic Object getItem(int pasition) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View view, ViewGroup parent){LayoutInflater inflater = MainActivity.this.getLayoutInflater();view = inflater.inflate(R.layout.listview_item, null);tvName = (TextView) view.findViewById(R.id.tv_name);tvAge = (TextView) view.findViewById(R.id.tv_age);tvName.setText("zhangsan" + position);tvAge.setText(String.valueOf(position + 28));return view;}}
}


 注意到在getView这个方法中有一个参数 View view,这是一个缓存的view,用于缓存已经存在的view,从上面的程序可以看出,每次调用getView这个方法都会重新创建一个inflater,这样就会导致资源的浪费,所有充分利用到view这个东西。经过改造后的个头View方法。 

if(view == null) {// 布局填充器对象, 用于把xml布局转换成view对象LayoutInflater inflater = MainActivity2.this.getLayoutInflater();view = inflater.inflate(R.layout.listview_item, null);tvName= (TextView) view.findViewById(R.id.tv_name);tvAge = (TextView) view.findViewById(R.id.tv_age);} else {view = view;}tvName.setText("zhangsan" + position);tvAge.setText(String.valueOf(position + 28));return view;


 

 再次注意到一个问题,当view为空是每次都还要查找tvName和tvAge这两个组件,未免也会让费不少的资源。这个时候通常会定义一个ViewHolder,就是一个持有者的类,他里面一般没有方法,只有属性,作用就是一个临时的储存器,把你getView方法中每次返回的View存起来,可以下次再用。这样做的好处就是不必每次都到布局文件中去拿到你的View,提高了效率。 

@Overridepublic View getView(int position, View view, ViewGroup parent) {ViewHolder holder = null;//复用,可以提升效率if (view == null) {LayoutInflater inflater = MainActivity.this.getLayoutInflater();view = inflater.inflate(R.layout.listview_item, null);holder = new ViewHolder();holder.tvName = (TextView) view.findViewById(R.id.tv_name);holder.tvAge = (TextView) view.findViewById(R.id.tv_age);view.setTag(holder);}else {holder = (ViewHolder)view.getTag();}holder.tvName.setText("zhangsan" + position);holder.tvAge.setText(String.valueOf(position + 28));return view;}}static class ViewHolder {TextView tvName;TextView tvAge;}
这样对自定义的BaseAdapter的优化就OK了~



本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部