您的位置:首页 > 其它

ListView性能优化

2016-05-10 16:42 423 查看
1.在MainActivity中,定义MyAdapter继承BaseAdapter,并且实现getCount(),getItem(),getItemId(),getView()的方法。在getView()方法中进行数据填充并且返回列表项视图。使用ListView的setAdapter()方法设置MyAdapter适配器。

2.性能优化:

(1)在getView(int position, View convertView, ViewGroup parent)方法中,重复使用convertView减少对象的创建。

(2)在MyAdapter中定义内部类ViewHolder,用于保存第一次查找的组件,避免下次重复查找。

MainActivity如下:

public class MainActivity extends ActionBarActivity {

private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(new MyAdapter(this));
}
static class MyAdapter extends BaseAdapter{
private String[] titles = {"title-1","title-2","title-3","title-4","title-5",
"title-6","title-7","title-8","title-9","title-10",
"title-11","title-12","title-13"};
private int[] icons = {android.R.drawable.ic_input_add,
android.R.drawable.ic_delete,
android.R.drawable.ic_dialog_email,
android.R.drawable.ic_dialog_info,
android.R.drawable.ic_dialog_map,
android.R.drawable.ic_dialog_map,
android.R.drawable.ic_dialog_map,
android.R.drawable.ic_dialog_map,
android.R.drawable.ic_dialog_map,
android.R.drawable.ic_dialog_map,
android.R.drawable.ic_dialog_map,
android.R.drawable.ic_dialog_map,
android.R.drawable.ic_dialog_map};
private Context context;
public MyAdapter(Context context){
this.context = context;
}
@Override
public int getCount() {
return titles.length;
}

@Override
public Object getItem(int position) {
return titles[position];
}

@Override
public long getItemId(int position) {
return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
//优化第二步:使用ViewHolder提高在容器中查找组件的效率
ViewHolder vh;
//优化1:重复使用convertView,减少对象的创建
if(convertView==null){
LayoutInflater inflater = LayoutInflater.from(context);
//实例化一个布局文件
convertView = inflater.inflate(R.layout.list_item,null);

vh = new ViewHolder();
vh.iv = (ImageView) convertView.findViewById(R.id.imageView);
vh.tv = (TextView) convertView.findViewById(R.id.textView);
convertView.setTag(vh);

}else{
vh = (ViewHolder) convertView.getTag();
}
vh.tv.setText(titles[position]);
vh.iv.setImageResource(icons[position]);

return convertView;
}
//内部类,用于保存第一次查找的组件,避免下次重复查找
static class ViewHolder{
ImageView iv;
TextView tv;
}
}


activity_main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>


list_item.xml如下:

<?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="wrap_content"
android:gravity="center_vertical"
android:padding="16dp">

<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView"
android:src="@mipmap/ic_launcher"/>

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Text"
android:id="@+id/textView"
android:paddingLeft="10dp"/>
</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: