上次说到关于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.