说明
——说到ListView,大家就会想到Adapter,GridView、ListView都离不开Adapter。而Adapter最重要的方法是使用getView()来绘制页面,今天我来讲解一下ListView的缓存优化问题。
XML布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
ListView的Item
<?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" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="50sp"
android:id="@+id/tv"/>
</LinearLayout>
主要方法
package com.example.listview;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
/**
1. ListView分布加载
2. @author WangJ
3. */
public class MainActivity extends Activity {
private String[] tv = new String[] { "1", "2", "3", "4", "5", "6", "7",
"8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18",
"19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29",
"30" };
private ListView mListView;
private ArrayList<String> mlist = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.list);
for (int i = 0; i < tv.length; i++) {
mlist.add(tv[i]);
}
mListView.setAdapter(new mListAdapter(getApplicationContext(), mlist));
}
class mListAdapter extends BaseAdapter {
private Context context;
private ArrayList<String> list;
public mListAdapter(Context context, ArrayList<String> list) {
this.context = context;
this.list=list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View converview, ViewGroup arg2) {
System.out.println("getView " +position +" "+ converview);
ViewHolder viewHolder = null;
if (converview == null) {
converview = View.inflate(context,R.layout.listview_item, null);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView) converview.findViewById(R.id.tv);
converview.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) converview.getTag();
}
viewHolder.textView.setText(list.get(position));
return converview;
}
}
class ViewHolder {
private TextView textView;
}
}
运行效果如图
这样就能利用ViewHolder 来让ListView每次不重复加载不必要的数据,从而优化内存