Gridview 自定义Adapter及优化

(1)和上次一样的GridView和布局
<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>
(2)写MyAdapter   extends  BaseAdapter
<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);  
        }  
(4)运行,结果见下图



向上或者向下滑动都会调用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;
}
即,把在getview方法中每次新建的view换成了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.
文档里面说是用于重用的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的定义
}
convertview避免了创建新的view并inflate,viewholder通过tag把自己和convertview连起来,
避免了每次都执行 findViewById,二者是优化adpter的主要途径。

最后别忘了,ImageView使用的图片要预处理。
showIcon = BitmapFactory.decodeResource(context.getResources(), R.drawable.logo);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值