QMUI Android使用9-巧用setTag()和getTag()实现QMUIGroupListView选项的点击批量处理

使用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()取出关联值,进行对比判断。

这种方式,完美的解决了字符串对比的问题。字符串不用写死,而且整数对比还比字符串对比效率高。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值