【问题标题】:How do I set listeners on an array of objects?如何在对象数组上设置侦听器?
【发布时间】:2020-04-13 14:49:35
【问题描述】:

我正在重构我的一个 Android 应用程序。在最初的版本中,我在主活动中实例化了同一个类的八个对象,并在它们上分别设置了侦听器。对于每个实例,我都初始化了一个单独的变量。 现在我想将对象添加到一个数组并在循环中设置监听器,但是当我测试应用程序时,监听器只设置在最后一个实例上。

    mObjects = new ArrayList<>();
    mObjects.add(createNewObject(R.id.objectPlaceholder1, R.id.objectProgressTextView));
    mObjects.add(createNewObject(R.id.objectPlaceholder2, R.id.object2ProgressTextView));
    mObjects.add(createNewObject(R.id.objectPlaceholder3, R.id.object3ProgressTextView));
    mObjects.add(createNewObject(R.id.objectPlaceholder4, R.id.object4ProgressTextView));
    mObjects.add(createNewObject(R.id.objectPlaceholder5, R.id.object5ProgressTextView));
    mObjects.add(createNewObject(R.id.objectPlaceholder6, R.id.object6ProgressTextView));
    mObjects.add(createNewObject(R.id.objectPlaceholder7, R.id.object7ProgressTextView));
    mObjects.add(createNewObject(R.id.objectPlaceholder8, R.id.object8ProgressTextView));

    for (int i = 0; i < mObjects.size(); ++i) {
        object = mObjects.get(i);
        object.image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                countDownEditText = findViewById(R.id.countdownEditText);
                if (countDownEditText.getText().toString().equals("")) {
                    showToastText(R.string.count_down_time);
                    return;
                }
                if (object.checkReadyForAction()) {
                    countDownTime = Integer.parseInt(countDownEditText.getText().toString());
                    object.startCountDown(countDownTime);
                } else {
                    showToastText(R.string.action_not_ready);
                }
            }
        });
        object.image.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                object.reset();
                return true;
            }
        });
    }

【问题讨论】:

  • 请提供您尝试过的代码
  • 请输入代码。没有代码真的很难猜到
  • @Fantômas 你为什么改标题?我想在数组中的每个对象上设置监听器。
  • ...和...它的含义是什么?您不必在标题中重复 TAGS。

标签: java android arrays object listener


【解决方案1】:

好的,我搞定了。刚刚实现了所需的侦听器。

    // ...

    for (int i = 0; i < mObjects.size(); ++i) {
        object = mObjects.get(i);
        object.image.setOnClickListener(new ObjectClickListener(object));
        object.image.setOnLongClickListener(new ObjectLongClickListener(object));
    }

    private class ObjectClickListener implements View.OnClickListener {

        ExampleObject mObject;

        ObjectClickListener(ExampleObject object) {
            mObject = object;
        }

        @Override
        public void onClick(View v) {
            countDownEditText = findViewById(R.id.countdownEditText);
            if (countDownEditText.getText().toString().equals("")) {
                showToastText(R.string.count_down_time);
                return;
            }
            if (mObject.checkReadyForAction()) {
                countDownTime = Integer.parseInt(countDownEditText.getText().toString());
                mObject.startCountDown(countDownTime);
            } else {
                showToastText(R.string.action_not_ready);
            }
        }
    }

    private class ObjectLongClickListener implements View.OnLongClickListener {

        ExampleObject mObject;

        ObjectLongClickListener(ExampleObject object) {
            mObject = object;
        }

        @Override
        public boolean onLongClick(View v) {
            mObject.reset();
            return true;
        }
    }

【讨论】:

    猜你喜欢
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多