2012-03-31 13 views
10

आंतरिक वर्ग एडाप्टर है, आंतरिक-आंतरिक वर्ग श्रोता है। श्रोता से एडाप्टर सदस्यों/तरीकों का उपयोग कैसे करें (अस्पष्ट)?दो डबल नेस्टेड अनाम आंतरिक कक्षाएं। प्रथम स्तर के अज्ञात वर्ग के सदस्यों को कैसे प्राप्त करें?

list.setAdapter(new Adapter() { 
    public View getView() { 
    // ... 
    button.setListener(new Listener() { 
     public void onClick() { 
     Adapter.this.remove(item); 
     } 
    ); 
    } 
}); 

आम तौर पर बाहरी वर्गों के सदस्यों तक पहुँचने के लिए, आप बस Outer.this.member कहते हैं, लेकिन इस मामले में यह मुझे निम्न त्रुटि (वास्तविक वर्ग का प्रयोग करके) दिया:

error: not an enclosing class: ArrayAdapter 

तो कैसे क्या आप आंतरिक कक्ष के सदस्यों से आंतरिक-आंतरिक वर्ग तक पहुंच सकते हैं? मुझे मल्टी लेवल नेस्टेड अज्ञात कक्षाएं पसंद नहीं हैं, लेकिन इस मामले में मैं एक नई एपीआई सीख रहा हूं और अभी तक क्लीनर तरीके से सुनिश्चित नहीं हूं। मेरे पास पहले से ही एक कामकाज है लेकिन वैसे भी जानना चाहता था। हटाएं() को आंतरिक-आंतरिक वर्ग द्वारा वास्तव में अस्पष्ट नहीं किया गया है, इसलिए कक्षा को निर्दिष्ट करना इस मामले में वास्तव में आवश्यक नहीं है, लेकिन यह कोड में स्पष्ट करना चाहता है जहां यह निकालना() विधि है। मैं यह भी जानना चाहता था कि यह अस्पष्ट है। मेरा मानना ​​है कि Outer.$6.remove() का उपयोग करना काम करेगा, लेकिन मुझे विश्वास नहीं है कि यह वही तरीका होना चाहिए।

उत्तर

12

असाइन this एक चर करने के लिए है, तो उस अंतरतम वर्ग में से एक का उपयोग।

list.setAdapter(new Adapter() { 
    public View getView() { 
    final Adapter that = this; 
    button.setListener(new Listener() { 
     public void onClick() { 
     that.remove(item); 
     } 
    ); 
    } 
}); 

मुझे यकीन नहीं है कि यहां एक अच्छा नामकरण क्या होगा। शायद adapter?

+0

मैं देखता हूं। मैंने सोचा कि एडाप्टर को पाने के लिए उपयोग करने के लिए एक भाषा वाक्यविन्यास होगा जिसे मैं नहीं जानता था। बीटीडब्ल्यू 'वह' अंतिम होना होगा। – Chloe

+1

मैं इस दृष्टिकोण को पसंद करता हूं क्योंकि यह आसानी से पठनीय और स्पष्ट है। – skrat

+0

मुझे लाइन एडाप्टर पर एक संकलन त्रुटि मिलती है जो = एडाप्टर.थिस; (एडाप्टर एक संलग्न वर्ग नहीं है)। इसके बजाय आपको अंतिम एडाप्टर कहना चाहिए कि = यह .. अगर बिल्कुल .. – sethu

0

अपने इस रूप में सरल: इस वर्ग के सूचक

+0

यह काम नहीं करेगा। निकालें() बाहरी की विधि नहीं है। यह एडाप्टर का एक तरीका है। – Chloe

1

बिना outer.remove कोशिश बस सीधे एडाप्टर पर विधि कॉल:

list.setAdapter(new Adapter() { 
    public View getView() { 
    // ... 
    button.setListener(new Listener() { 
     public void onClick() { 
     remove(item); // <-- this will call Adapter's method of the anonymous class 
     } 
    ); 
    } 
}); 
+2

मुझे पता है कि। लेकिन क्या होगा यदि श्रोता के पास निकालें() विधि है। फिर क्या? – Chloe

+1

अच्छा सवाल! मैं आज रात में देख लूंगा। – Bohemian