2012-07-03 31 views
1

今天我被告知我們可以在我們的Android項目中引入一個MVC(或者準MVC)架構。我有一些類包含用戶主要輸入的信息,並且我希望我的視圖(爲了討論的緣故,假設它是TextView)來顯示它。我最初的想法是,每當我更新包含數據的類時,我都會調用一個方法在我的TextView上反映出來。Android:如何讓我自己的EventListener?

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

我知道我不得不作出一個專門的類,它充當控制器和作用是通知的更新發生且其活動對象是(也許如果我將Data中的每個成員變量作爲參數onUpdated(),這樣我只能將「差異」發送給「活動」,而不是「整體」。

我的問題01: 我比肯定知道如何通知我更新的活動度(換句話說,如何火onUpdated()方法)。

我的文檔02: 我不確定如何確定一個對象被更新。如果任何成員不同,我想通知它,但如何?我們是否應該始終保持對象的最新狀態,並將其所有成員變量與當前變量的成員變量進行比較?

回答

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 新增的偵聽器監聽的使用示範另一個回調方法。

+0

嘿,謝謝你的快速回答!你的建議似乎很好。但是,我應該把所有的'setVariables()'方法(在這種情況下,'setI()','setD()','setS()')放到'public void update(Data data)'方法中嗎?我的實際'Date'類有幾個相同類型的變量(int a,int b,int c,...),我不知道如何處理它們。 :( – Quv

+0

看看編輯過的內容是否有幫助,在我看來,你在update方法中使用setI()等的建議實現是好的 –

+0

再次感謝我試圖實現它,所以請稍等一下,直到我接受你的答案。 – Quv

相關問題