(1)和上次一样的GridView和布局
(2)写MyAdapter
extends
BaseAdapter
(4)运行,结果见下图
用convertview
根据一篇博文 ListView 编程: 如何优化自定义 Adapter ,(基本参考了这篇)如果是listview的话,在显示第一屏的item调用getView的时候,convertview就会=null,
在往下 翻或者翻回来的时候,convertview就不是null了。
但是gridview可能因为在布局中是存在一个LinearLayout(但是不确定)(也有可能是之前运行过,缓存没有清,因为之后出来了是null),所以看不出来效果
根据convertview一开始为null的条件可以做出如下优化,
即,把在getview方法中每次新建的view换成了convertview,
那么,啥是convertview?
文档里面说是用于重用的view,要保证非空和类型匹配。
也就是开始显示的时候创建一屏的item是会新建view,之后就是重用之前创建的convertview了
优化2:
用ViewHolder
convertview避免了创建新的view并inflate,viewholder通过tag把自己和convertview连起来,
避免了每次都执行 findViewById,二者是优化adpter的主要途径。
最后别忘了,ImageView使用的图片要预处理。
<GridView
android:id="@+id/grid"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:numColumns="3"
></GridView>
//gridview_item
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/item_img"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<TextView
android:id="@+id/item_text"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
<blockquote>public class MyAdapter extends BaseAdapter {
打好log,然后从日志里面看自定义Adapter的作用。
(3)java文件
ArrayList<String> arrays = new ArrayList<String>();
for(int i=0; i<100; i++) {
arrays.add("" + i);
}
向上或者向下滑动都会调用getView,也就是一开始出现在视野内的东西,离开之后在回来还是会调用getView
优化1:用convertview
根据一篇博文 ListView 编程: 如何优化自定义 Adapter ,(基本参考了这篇)如果是listview的话,在显示第一屏的item调用getView的时候,convertview就会=null,
在往下 翻或者翻回来的时候,convertview就不是null了。
但是gridview可能因为在布局中是存在一个LinearLayout(但是不确定)(也有可能是之前运行过,缓存没有清,因为之后出来了是null),所以看不出来效果
根据convertview一开始为null的条件可以做出如下优化,
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("mark", "getView() is invoked!" + "position = " + position + ","
+ "convertView = " + convertView + "," + "parent = " + parent);
if (convertView == null) {
convertView = inflater.inflate(R.layout.gridview_item, null);
}
((ImageView) convertView.findViewById(R.id.image_pic))
.setImageResource(R.drawable.logo);
((TextView) convertView.findViewById(R.id.text_content))
.setText("logo" + arrays.get(position));
return convertView;
}
那么,啥是convertview?
convertView | The old view to reuse, if possible. Note: You should check that this view is non-null and of an appropriate type before using. If it is not possible to convert this view to display the correct data, this method can create a new view. |
也就是开始显示的时候创建一屏的item是会新建view,之后就是重用之前创建的convertview了
优化2:
用ViewHolder
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d("mark", "getView() is invoked!" + "position = " + position + ","
+ "convertView = " + convertView + "," + "parent = " + parent);
ViewHolder vHolder = null;
if (convertView == null) {
convertView = inflater.inflate(R.layout.gridview_item, null);
vHolder = new ViewHolder();
vHolder.pic = (ImageView) convertView.findViewById(R.id.item_img);
vHolder.content = (TextView) convertView.findViewById(R.id.item_text);
// 設置 Tag
convertView.setTag(vHolder);
} else {
vHolder = (ViewHolder) convertView.getTag();
}
vHolder.pic.setImageResource(R.drawable.logo);
vHolder.content.setText("logo" + arrays.get(position));
return convertView;
}
static class ViewHolder {//类定义,静态内部类
TextView content;
ImageView pic;
// 很多view的定义
}
避免了每次都执行 findViewById,二者是优化adpter的主要途径。
最后别忘了,ImageView使用的图片要预处理。
showIcon = BitmapFactory.decodeResource(context.getResources(), R.drawable.logo);