展会信息港展会大全

android开发中ListView的Item点击事件(消息传递)
来源:互联网   发布日期:2015-12-04 16:38:41   浏览:5054次  

导读:自定义ListView的Adapter,给Item中的子控件 (按钮、图标、文字等)添加点击事件,来进行点击后的不同处理,是经常要做的事情。但有些需要在处理事件中,对Activity中其他控件进行更新的话, 通常把Adapter在 ...

自定义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));

赞助本站

人工智能实验室
AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港