1

今天有人告诉我,我们可以在我们的 Android 项目中引入 MVC(或准 MVC)架构。我有一些类包含主要由用户输入的信息,我希望我的视图(假设它是TextView,为了讨论)显示它。我最初的想法是,每次我更新包含数据的类时,我都会调用一个方法来将其反映在我的TextView.

Data d = new Data();
TextView t = (TextView) findViewById(R.id.IamTextView);

// ....

d.setS("Foo");           //  <--- Data updated!
t.setText(d.getS());   //  <--- View updated, too!

这无疑是蹩脚的,尽管只要数据更新的情况非常有限并且我们知道它们都在哪里就可以了,但我想尝试一些更酷更聪明的东西。所以我正在定义一个自定义EventListener...

public class Data {
    protected int i;
    protected double d;
    protected String s; 
    //Setter & Getter omitted!
}

public interface Data.onUpdatedListener {
    public void onUpdated (Data d);
}

public class TestActivitiy extends Activity implements Data.onUpdatedListener {

        Date[] d;

        //onCreate() omitted!

        @Override public void onUpdated (Data d) {
            // I want to reflect this change on my Views, like below.
            TextView t = (TextView) findViewById(R.id.IamTextView);
            t.setText(d.getS());
        }
}

我知道我必须创建一个用作 Controller 的专用类,其作用是通知 Activity 发生了更新以及它是哪个对象(如果我将每个成员变量都设置DataonUpdated()我只能将“差异”发送给 Activity,而不是整个对象)。

我的问题 01: 我不确定如何通知我的更新活动(换句话说,如何触发onUpdated()方法)。

我的问题 02: 我不确定如何确定对象已更新。如果有任何成员不同,我想通知它,但如何?我们是否应该始终保留对象的最新状态,并将其所有成员变量与当前变量的成员变量进行比较?

4

1 回答 1

3

在您要更新的类中Data,定义监听器并为监听器提供一个 setter 方法。

class Data {
    A a;
    B b;
    C c;

    //...constructor, setter, getter, etc
}

class A {
    Listener listener;

    interface Listener {
        void onUpdate(Data data);
        // another abstract method accepting A, B and C as parameters,
        // just an example and can be omitted if onUpdate(Data) is sufficient
        void onUpdate(A a, B b, C c);
    }

    public void setListener(Listener listener) {
        this.listener = listener;
    }

    public void update(Data data) { // the method that is to update the Data
        if (listener != null) {
            listener.onUpdate(data);
            listener.onUpdate(data.a, data.b, data.c);
        }
    }

    public void update(A a, B b, C c) { // another method to update the Data
        if (listener != null) {
            // Assume you have this constructor for Data,
            // just for the ease of understanding.
            listener.onUpdate(new Data(a, b, c));
            listener.onUpdate(a, b, c);
        }
    }
}

class B implements A.listener {
    // In somewhere
    setListner(this);

    @Override
    void onUpdate(Data data) {
       // your implementation
    }

    @Override
    void onUpdate(A a, B b, C c) {
       // your implementation
    }
}

EDITED 在监听器中添加了另一个回调方法,用于演示监听器的使用。

于 2012-07-03T03:28:16.943 回答