使用QMUIGroupListView创建列表项后,对其中的列表项QMUICommonListItemView点击事件进行处理,有2种方法。
一个是在创建选项的时候,把监听事件写进去;一个是指定一个事件方法,在事件方法里面统一处理。官方的demo在QDGroupListViewFragment样例中使用的是统一处理的方式,但是采用的是字符串对比进行流程分发,我总感觉这种方式不太好。后来终于找到一种更好的方式,就是使用setTag和getTag的方式。
比如我们采用QMUIGroupListView实现的界面如下。要对4个选项(账号、用户版本、到期时间、退出登录)进行点击处理。
官方给的方式,是采用统一处理,我们按照官方的方式,代码如下。
初始化界面的方法:
//初始化用户中心
private void initUserInfo() {
//用户账号
QMUICommonListItemView itemUsername = mGroupListView.createItemView("账号");
itemUsername.setDetailText("大路");
itemUsername.setAccessoryType(QMUICommonListItemView.ACCESSORY_TYPE_CHEVRON);
//用户版本
QMUICommonListItemView itemVersion = mGroupListView.createItemView("用户版本");
itemVersion.setAccessoryType(QMUICommonListItemView.ACCESSORY_TYPE_CHEVRON);
itemVersion.setDetailText("标准版");
//有效期
QMUICommonListItemView itemExpireDate = mGroupListView.createItemView("到期时间");
itemExpireDate.setAccessoryType(QMUICommonListItemView.ACCESSORY_TYPE_CHEVRON);
itemExpireDate.setDetailText("2018年6月21日 10:00:40");
//有效期
QMUICommonListItemView itemLogout = mGroupListView.createItemView("退出登录");
itemLogout.setAccessoryType(QMUICommonListItemView.ACCESSORY_TYPE_CHEVRON);
itemLogout.getTextView().setTextColor(getResources().getColor(R.color.qmui_config_color_red));
QMUIGroupListView.newSection(MainActivity.this)
.setTitle("用户中心")
.addItemView(itemUsername, mOnClickListenerGroup)
.addItemView(itemVersion, mOnClickListenerGroup)
.addItemView(itemExpireDate, mOnClickListenerGroup)
.addItemView(itemLogout, mOnClickListenerGroup)
.addTo(mGroupListView);
}
事件统一处理的方法:
//统一处理选项点击事件
private View.OnClickListener mOnClickListenerGroup = new View.OnClickListener() {
@Override
public void onClick(View view) {
QMUICommonListItemView viewList = (QMUICommonListItemView) view;
Log.d(TAG, "选项:" + viewList.getText().toString() + " 点击了");
switch (viewList.getText().toString()) {
case "账号":
break;
case "用户版本":
break;
case "到期时间":
break;
case "退出登录":
break;
}
Toast.makeText(MainActivity.this,"选项:" + viewList.getText().toString() + " 点击了",Toast.LENGTH_SHORT).show();
}
};
在QMUIGroupListView.newSection的addItemView方法中,指定了点击事件处理方法mOnClickListenerGroup,在mOnClickListenerGroup中进行事件的统一处理。
统一处理的判断条件是字符串对比。这种方式不好。在Android中,字符串都是推荐要提取出来放到string.xml文件中,然后通过字符串资源的方式进行调用。但是如果把字符串提取到资源文件中,那么又将无法作为case的对比条件,因为switch case里面只能使用常量对比。所以稍微好点的方式,就是把字符串提取为字符串常量,演变为下面的代码。
public static final String USERNAME = "账号";
public static final String USER_VERSION = "用户版本";
public static final String EXPIRE_TIME = "到期时间";
public static final String LOGOUT = "退出登录";
//统一处理选项点击事件
private View.OnClickListener mOnClickListenerGroup = new View.OnClickListener() {
@Override
public void onClick(View view) {
QMUICommonListItemView viewList = (QMUICommonListItemView) view;
Log.d(TAG, "选项:" + viewList.getText().toString() + " 点击了");
switch (viewList.getText().toString()) {
case USERNAME:
break;
case USER_VERSION:
break;
case EXPIRE_TIME:
break;
case LOGOUT:
break;
}
Toast.makeText(MainActivity.this,"选项:" + viewList.getText().toString() + " 点击了",Toast.LENGTH_SHORT).show();
}
};
这种方式稍微好点,但总归还是字符串对比,字符串还是写死到了代码里面。而且这些字符串要显示到UI上,这对多语言是不利的。
最终我们可以通过setTag来关联一个数据,使用getTag来取出关联的数据,进行case条件判断。
setTag方法有两种用法,我们只需要用第一种,传递一个int值进去即可。
public void setTag(Object tag);
public void setTag(int key, Object tag);
然后在case时,使用getTag取出int值进行对比。
改进后的代码如下。
//统一处理选项点击事件
private View.OnClickListener mOnClickListenerGroup = new View.OnClickListener() {
@Override
public void onClick(View view) {
QMUICommonListItemView viewList = (QMUICommonListItemView) view;
Log.d(TAG, "选项:" + viewList.getText().toString() + " 点击了");
switch ((int)viewList.getTag()) {
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
}
Toast.makeText(MainActivity.this,"选项:" + viewList.getTag()+ " 点击了",Toast.LENGTH_SHORT).show();
}
};
//初始化用户中心
private void initUserInfo() {
//用户账号
QMUICommonListItemView itemUsername = mGroupListView.createItemView("账号");
itemUsername.setDetailText("大路");
itemUsername.setAccessoryType(QMUICommonListItemView.ACCESSORY_TYPE_CHEVRON);
itemUsername.setTag(1);
//用户版本
QMUICommonListItemView itemVersion = mGroupListView.createItemView("用户版本");
itemVersion.setAccessoryType(QMUICommonListItemView.ACCESSORY_TYPE_CHEVRON);
itemVersion.setDetailText("标准版");
itemVersion.setTag(2);
//有效期
QMUICommonListItemView itemExpireDate = mGroupListView.createItemView("到期时间");
itemExpireDate.setAccessoryType(QMUICommonListItemView.ACCESSORY_TYPE_CHEVRON);
itemExpireDate.setDetailText("2018年6月21日 10:00:40");
itemExpireDate.setTag(3);
//有效期
QMUICommonListItemView itemLogout = mGroupListView.createItemView("退出登录");
itemLogout.setAccessoryType(QMUICommonListItemView.ACCESSORY_TYPE_CHEVRON);
itemLogout.getTextView().setTextColor(getResources().getColor(R.color.qmui_config_color_red));
itemLogout.setTag(4);
QMUIGroupListView.newSection(MainActivity.this)
.setTitle("用户中心")
.addItemView(itemUsername, mOnClickListenerGroup)
.addItemView(itemVersion, mOnClickListenerGroup)
.addItemView(itemExpireDate, mOnClickListenerGroup)
.addItemView(itemLogout, mOnClickListenerGroup)
.addTo(mGroupListView);
}
区别的地方在于,每个QMUICommonListItemView都调用了setTag方法关联一个int值,在switch的时候使用(int)viewList.getTag()取出关联值,进行对比判断。
这种方式,完美的解决了字符串对比的问题。字符串不用写死,而且整数对比还比字符串对比效率高。