自定义ListView的Adapter,给Item中的子控件 (按钮、图标、文字等)添加点击事件,来进行点击后的不同处理,是经常要做的事情。但有些需要在处理事件中,对Activity中其他控件进行更新的话, 通常把Adapter在Activity中实现,处理比较多的话,在Activity中增加几百行代码还是比较普遍的情况。 我的习惯,还是把Adapter独立出来。那么,其他控件的更新如何处理呢?
当然,每个人的习惯不同,我这里只是阐述一种思路,如果您觉得有用,可以作为参考;其他就麻烦绕道吧。
首先,还是看下实现效果吧:
本文介绍:
主要是通过Handler管理Message的方式,在Adapter处理点击事件时,将所需数据传送回所属Activity。在Activity中处理 点击事件的后续操作的同时,又将Adapter独立了出来,代码结构就比较清晰,便于阅读和管理了。
Adapter的重写,主要处理集中在getView方法中,这个想必大家都比较了解了,不赘述,请参见源代码,代码目录结构如下:
功能的实现比较简单,主要是一种方式,主要两部分:
一、在LiChildClickActivity中为LiccAdapter设置Handler
首先,在Activity中定义Handler,用于接收点击事件返回的值:
private Handler mHandle = new Handler() {
@Override
public void handleMessage(Message msg) {
LiData data = (LiData) msg.getData().getSerializable(LiccAdapter.BUNDLE_KEY_LIDATA);
switch(msg.what) {
case LiccAdapter.CLICK_INDEX_ITEM:
onItemClicked(msg.arg1, data);
break;
case LiccAdapter.CLICK_INDEX_COUNTRY:
onCountryClicked(data);
break;
case LiccAdapter.CLICK_INDEX_NAME:
onNameClicked(data);
break;
}
}
};
这样,在LiccAdapter中,处理点击事件时发送的消息,就可以在handleMessage中接收,并处理了。而且,onNameClicked 等方法中,涉及到Activity中包含的一些成员,或布局中的其他控件时,就不用担心,在LiccAdapter中无法调用了。
二、在LiccAdapter中设置点击事件,并通过Message将数据回传
首先,定义一些成员变量及静态变量,保存数据,对应状态:
private Context context;
// 点击索引:点击列表项;点击按钮;点击名字。
protected final static int CLICK_INDEX_ITEM = 0;
protected final static int CLICK_INDEX_COUNTRY = 1;
protected final static int CLICK_INDEX_NAME = 2;
// 记录数据列表
private ArrayList<LiData> list;
// 记录Activity中接受消息的Handler
private Handler mHandle;
// 关键字
protected final static String BUNDLE_KEY_LIDATA = "lidata";
// 构造方法
public LiccAdapter(Context context, Handler handle, ArrayList<LiData> list) {
this.context = context;
mHandle = handle;
this.list = new ArrayList<LiData>();
for(LiData data : list) {
this.list.add(data);
}
}
最后,在重写的getView中,为各个子元素设置监听即可:
// 这个holder,您懂的吧。
// 为按钮设置点击事件监听
holder.mCountry.setOnClickListener(
new OnItemChildClickListener(CLICK_INDEX_COUNTRY, position));
// 为名字设置点击事件监听
holder.mName.setOnClickListener(
new OnItemChildClickListener(CLICK_INDEX_NAME, position));
// 设置列表项的监听事件
convertView.setOnClickListener(
new OnItemChildClickListener(CLICK_INDEX_ITEM, position));