有时候用ListView,Item中的控件监听事件复杂时,在Adapter中处理就不太方便,因为很多时候需要控件本身的引用,或者Context等,因为前段时间看到鸿洋的Fragment解析,看到他在Fragment中声明一个接口,然后再Activity实现这个接口,觉得很方便,体会了下,然后觉得这种写法很好,代码如下:
这是Activity代码
public class ListDemoActivity extends Activity {
ListView listView;
List<String> list;
EditGroupAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_change_group);
MyItemClickListener listener = new MyItemClickListener() {
@Override
public void onItemClick(View v) {
// 在这里做处理
}
};
adapter = new EditGroupAdapter(listener, this);
adapter.setGroupList(list);
listView.setAdapter(adapter);
}
public interface MyItemClickListener {
void onItemClick(View v);
}
}
这是Adapter的代码:
public class EditGroupAdapter extends BaseAdapter {
Activity context;
MyItemClickListener listener;
List<String> list;
LayoutInflater inflater;
public EditGroupAdapter(MyItemClickListener listener, Activity context) {
this.listener = listener;
this.context = context;
inflater = LayoutInflater.from(context);
}
public void setGroupList(List<String> list) {
this.list = list;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup root) {
// TODO Auto-generated method stub
ViewHolder holder = null;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_group_change, null);
holder.info = (TextView) convertView.findViewById(R.id.tv_info);
holder.info.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
listener.onItemClick(v);
}
});
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
private static class ViewHolder {
TextView info;
}
}
代码不难,就是在Activity声明一个接口,内部实现,然后通过方法或者构造传到Adapter里面,在Adapter里面的getView()方法添加事件,传到Activity的接口方法处理就好,如果需要什么参数,可以定义接口方法的参数,很简单。
第一篇博客,完成。