ListView中含有Button时setOnclickListener的高效写法

        上次说到关于ListView中含有Button时setOnclickListener应写在Adapter的什么地方。在最近的开发当中发现一种更好的解决方法。写下来供大家参考。

        主要是对Adapter的改进,之前的方案是

package com.yang.listviewclick.adapter;

import java.util.List;

import com.yang.listviewclick.R;

import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class EffectiveListViewAdapter extends BaseAdapter {
	private Context mContext;
	private List<String> list = null;

	private static final String TAG = "ListViewAdapter";

	public EffectiveListViewAdapter(Context mContext, List<String> list) {
		this.mContext = mContext;
		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 0;
	}

	class ViewHolder {
		TextView no;
		TextView click;
	}

	@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));
		}
	}

}

改进方案是

package com.yang.listviewclick.adapter;

import java.util.List;

import com.yang.listviewclick.R;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class EffectiveListViewAdapter extends BaseAdapter {
	private Context mContext;
	private List<String> list = null;

	public EffectiveListViewAdapter(Context mContext, List<String> list) {
		this.mContext = mContext;
		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 0;
	}

	class ViewHolder {
		TextView no;
		TextView click;
	}

	@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.click.setOnClickListener(listener);
		holder.click.setTag(value);
		
		holder.no.setText(value);
		return convertView;
	}

	private View.OnClickListener listener = new View.OnClickListener(){
		@Override
		public void onClick(View v) {
			Toast.makeText(mContext, (String)v.getTag(), Toast.LENGTH_SHORT).show();
		}
	};

}

同样适用了,setTag()、getTag()方法,这次将这个方法用在了对对象的保存上。这样的方案会更直观一些,mark一下。

注释:View中的setTag(Onbect)表示给View添加一个格外的数据,以后可以用getTag()将这个数据取出来。

官方网站的解释如下:http://developer.android.com/reference/android/view/View.html#setTag(java.lang.Object)

Sets the tag associated with this view. A tag can be used to mark a view in its hierarchy and does not have to be unique within the hierarchy. Tags can also be used to store data within a view without resorting to another data structure.


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值