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());
        }
}

DataControllerとして機能する専用のクラスを作成する必要があることはわかっています。その役割は、更新が発生し、それがどのオブジェクトであるかをActivityに通知することです(すべてのメンバー変数をのパラメーターとして作成するとonUpdated()、非常に役立ちます。オブジェクト全体ではなく、アクティビティにのみ「違い」を送信できます)。

私の問題01: 更新のアクティビティを通知する方法(つまり、メソッドを起動する方法)がよくわかりませんonUpdated()

私の問題02: オブジェクトが更新されていることを確認する方法がわかりません。メンバーのいずれかが違う場合はお知らせしたいのですが、どうすればいいですか?オブジェクトの最新の状態を常に保持し、それらのすべてのメンバー変数を現在の変数のメンバー変数と比較する必要がありますか?

4

1 に答える 1

3

を更新するクラスでData、リスナーを定義し、リスナーにセッターメソッドを提供します。

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
    }
}

編集済み リスナーの使用法を示すために、リスナーに別のコールバックメソッドを追加しました。

于 2012-07-03T03:28:16.943 に答える