2016-10-27 11 views
5

मैं एमवीपी आर्किटेक्चर का उपयोग करके एंड्रॉइड ऐप में एक स्क्रीन को लागू करने और व्यू तरफ आरएक्सजेवा और आरएक्सबाइंडिंग का उपयोग करने की कोशिश कर रहा हूं।एंड्रॉइड ऐप में आरएक्सजेवा और एमवीपी

असल में मेरे पास 2 स्पिनर, 1 टेक्स्ट एडिट और एक बटन जो डिफ़ॉल्ट रूप से अक्षम है। मैं बटन को सक्षम करना चाहता हूं जब स्पिनरों के पास आइटम चुने जाते हैं और टेक्स्ट फ़ील्ड खाली नहीं होता है। यहाँ कोड है:

Observable.combineLatest(
     RxAdapterView.itemSelections(mFirstSpinner), 
     RxAdapterView.itemSelections(mSecondSpinner), 
     RxTextView.textChanges(mEditText), 
     new Func3<Integer, Integer, CharSequence, Boolean>() { 
      @Override 
      public Boolean call(Integer first, Integer second, CharSequence value) { 
       return !TextUtils.isEmpty(value); 
      } 
     }).subscribe(new Action1<Boolean>() { 
     @Override 
     public void call(Boolean enable) { 
      mButton.setEnabled(enable); 
     } 
    }); 

अब सवाल एकीकृत करने की विधि है कि एमवीपी स्वरूप में है। आदर्श रूप से बटन को सक्षम करने का "व्यावसायिक तर्क" प्रस्तुतकर्ता में होना चाहिए। इसे प्राप्त करने का सबसे अच्छा तरीका क्या है? मैं मूल पर्यवेक्षकों को प्रस्तुतकर्ता में किसी भी तरह से पारित करने की सोच रहा हूं (साइड सवाल कैसे है?), और प्रस्तुतकर्ता उन पर्यवेक्षकों को जोड़ देगा और इसमें बटन को सक्षम करने का तर्क होगा। अंत में, यह केवल बटन स्थिति को संशोधित करने के लिए दृश्य को कॉल करेगा।

क्या कोई बेहतर विकल्प हैं? क्या आरएक्सजेवा के साथ व्यू साइड पर एमवीपी का कोई अच्छा उदाहरण है?

उत्तर

5

मेरा प्रस्ताव:

आप सही रास्ते पर हैं। हालांकि RxBinding तर्क अभी भी दृश्य में होना चाहिए। मैं बटन को सक्षम करने के लिए या प्रस्तुतकर्ता में नहीं, यह तय करने के साथ जुड़े तर्क को स्थानांतरित कर दूंगा।

सभी क्षेत्रों से एक मॉडल पकड़े मूल्य को परिभाषित करें आप जाँच करना चाहते हैं:

private class ViewValuesModel { 
    public Integer adapter1Value; 
    public Integer adapter2Value; 
    public CharSequence textValue; 

    public ViewValuesModel(Integer adapter1Value, Integer adapter2Value, CharSequence textValue) { 
     this.adapter1Value = adapter1Value; 
     this.adapter2Value = adapter2Value; 
     this.textValue = textValue; 
    } 
} 

एक दृश्य के अंदर बनाने के एक Observable:

:

Observable observable = Observable.combineLatest(
     RxAdapterView.itemSelections(mFirstSpinner), 
     RxAdapterView.itemSelections(mSecondSpinner), 
     RxTextView.textChanges(mEditText), 
     new Func3<Integer, Integer, CharSequence, ViewValuesModel>() { 
      @Override 
      public ViewValuesModel call(Integer first, Integer second, CharSequence value) { 
       return new ViewValuesModel(first, second, value); 
      } 
     } 
) 

फिर प्रस्तोता को यह Observable पारित

mPresenter.observeChoosableFieldChanges(observable). 

प्रस्तुतकर्ता के अंदर बाकी करें:

observable 
    .map(new Func1<ViewValuesModel, Boolean>() { 
     @Override 
     public Booleancall(ViewValuesModel viewStates) { 
      return !TextUtils.isEmpty(viewStates.textValue); 
     } 
    }) 
    .subscribe(new Action1<Boolean>() { 
     @Override 
     public void call(Boolean enable) { 
      if (enable) { 
       view.enableButton(); 
      } 
     } 
    }); 
+0

यह उस दृष्टिकोण के समान है जो मैंने सुझाया और कार्यान्वित किया। केवल अंतर यह है कि मैं दृश्य पक्ष पर संयोजन के बजाय प्रस्तुति के लिए 3 अलग पर्यवेक्षकों को पास करता हूं।उनमें से 3 संयोजन भी "व्यापार" तर्क का प्रकार है। भविष्य में हम केवल 2 फ़ील्ड का उपयोग करना चाहेंगे, या कुछ और जोड़ सकते हैं। –

0

आप अपने स्रोतों की गणना और एक विषय/प्रोसेसर जहां तर्क है या नहीं, बटन और बाद बूलियन घटनाओं सक्षम करने के लिए क्या कर सकते हैं करने के लिए जोड़ी मूल्य घटनाओं पारित कर सकते हैं। वह व्यक्ति जो प्रस्तुतकर्ता से बटन अपडेट करता है, इस विषय/प्रोसेसर की सदस्यता लेगा।

इस तरह आपके पास प्रेजेंटर-व्यू अनुबंध को बदले बिना स्रोतों और तर्क को बदलने की लचीलापन है।

अनिवार्य रूप से आप प्रस्तुतकर्ता में 2 पूरी तरह से decoupled घटक हो सकते हैं:

1) घटक है जो आने वाली घटनाओं को देखने को सुनता है और कार्रवाई की एक धारा को सक्षम या बटन 2) एक घटक है जो सुनता निष्क्रिय करने के लिए पैदा करता है क्रियाओं को सक्षम/अक्षम करें और क्रमशः दृश्य अपडेट करें (यह आप Google की बाइंडिंग लाइब्रेरी के साथ भी प्राप्त कर सकते हैं)

इस तरह आप इंटरैक्शन की कई डीकॉप्लेड चेन सक्षम कर सकते हैं और प्रवाह कनेक्शन की उचित घटकों और स्पष्टता को बनाए रखने में अभी तक आसान बना सकते हैं।

आप RHub library जैसे smth का भी उपयोग कर सकते हैं। आप घटक उदाहरण here

संबंधित मुद्दे