ListView中控件添加Listener的优化

借鉴文档:http://blog.csdn.net/yangzl2008/article/details/7863938

本文是借鉴网友Snowball的<<ListView中含有Button时setOnclickListener应写在Adapter的什么地方>>文章,再进行整理和添加自己的想法



我们知道,listview中经常需要用到自定义的布局,并为布局中的控件添加监听器



原始的方法

借鉴Snowball的例子,

@Override  
public View getView(final int position, View convertView, ViewGroup parent) {  
    ViewHolder holder = null;  
    if (convertView == null) {  
        convertView = View.inflate(mContext, R.layout.listview_item, null);  
        holder = new ViewHolder();  
        holder.no = (TextView) convertView.findViewById(R.id.no);  
        holder.click = (TextView) convertView.findViewById(R.id.click);  
        convertView.setTag(holder);  
    } else {  
        holder = (ViewHolder) convertView.getTag();  
    }  
    String value = list.get(position);  
    holder.no.setText(value);  
      
    OnClick listener = new OnClick(position);  
    holder.click.setOnClickListener(listener);  
      
    Log.d(TAG,  
            "position is " + position + " listener is "  
                    + listener.toString());  
    return convertView;  
}  
优点: 添加事件,并能准确定位到item

缺点: 效率低,每次调用getView都会new Listener对象,(即bindView和newView都会new Listener对象)




改进

同样借鉴Snowball的例子,
  @Override  
    public View getView(final int position, View convertView, ViewGroup parent) {  
        ViewHolder holder = null;  
        OnClick listener = null;  
        if (convertView == null) {  
            convertView = View.inflate(mContext, R.layout.listview_item, null);  
            holder = new ViewHolder();  
            holder.no = (TextView) convertView.findViewById(R.id.no);  
            holder.click = (TextView) convertView.findViewById(R.id.click);  
            listener = new OnClick();//在这里新建监听对象  
            holder.click.setOnClickListener(listener);  
            convertView.setTag(holder);  
            convertView.setTag(holder.click.getId(), listener);//对监听对象保存  
        } else {  
            holder = (ViewHolder) convertView.getTag();  
            listener = (OnClick) convertView.getTag(holder.click.getId());//重新获得监听对象  
        }  
        String value = list.get(position);//设置监听对象的值  
        holder.no.setText(value);  
        listener.setPosition(position);  
        Log.d(TAG,  
                "position is " + position + " listener is "  
                        + listener.toString());  
        return convertView;  
    }  
  
    class OnClick implements OnClickListener {  
        int position;  
  
        public void setPosition(int position) {  
            this.position = position;  
        }  
  
        @Override  
        public void onClick(View v) {  
            Log.d(TAG, list.get(position));  
        }  
    }  

讲解:
在newView(即if (convertView == null)成立)过程中,新建Listener, 并通过setTag保存起来
在bindView(即if (convertView == null)不成立)过程中,通过getTag重新获得Listener对象
再通过调用listener.setPosition()的方法,改变属性,实现定位item






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值