借鉴文档: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