Android 解锁for循环中添加点击事件的正确姿势

for循环中添加点击事件的正确写法

前言:
我们通常在写自定义控件向ViewGroup中动态添加View的时候,有时候没个View都要有它的点击事件。我们可以在for循环中依次添加当前View的点击事件,但是,就造成了资源的浪费。因为,假如我们循环了10次,它就new了10个点击对象,但实际最后只用了最后一个。

错误姿势

for (int i = 0; i < listBean.getPhraseList().size(); i++) {
                final TextView textView = new TextView(activity);
                textView.setGravity(Gravity.CENTER);
                textView.setText(listBean.getPhraseList().get(i).getContent());
                textView.setTextSize(text_size);
                textView.setTextColor(activity.getApplicationContext().getResources().getColor(R.color.black));
                textView.setBackgroundDrawable(activity.getApplicationContext().getResources().getDrawable(R.drawable.fast_words_bg));
                textView.setPadding(text_padding, text_padding, text_padding, text_padding);
                flowLayout.addView(textView);
                textView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        //do something
                    }
                });           
            }

正确姿势

for (int i = 0; i < listBean.getPhraseList().size(); i++) {
                final TextView textView = new TextView(activity);
                textView.setGravity(Gravity.CENTER);
                textView.setText(listBean.getPhraseList().get(i).getContent());
                textView.setTextSize(text_size);
                textView.setTextColor(activity.getApplicationContext().getResources().getColor(R.color.black));
                textView.setBackgroundDrawable(activity.getApplicationContext().getResources().getDrawable(R.drawable.fast_words_bg));
                textView.setPadding(text_padding, text_padding, text_padding, text_padding);
                flowLayout.addView(textView);
                textView.setOnClickListener(itemClick);

                //给View做tag标记
                textView.setTag(i);
            }




View.OnClickListener itemClick=new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (RoomActivity.instance != null) {
                int position= (int) view.getTag(); //获取点击的View的标记
                TextView textView= (TextView) flowLayout.getChildAt(position); //通过标记的position获取子View
                //do something
            }
        }
    };

此方式是先遍历的时候将所有的View进行tag标记其position,再在循环外创建点击事件,通过View的tag获取这个View对象,再进行对应的点击效果。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值