2012-11-22 15 views
22

मैं सिर्फ ListViewव्यूहोल्डर पैटर्न में क्यों ViewHolder क्लास स्थिर होना चाहिए?

मेरे रीडिंग अनुकूलन करने के लिए निम्नलिखित पैटर्न मैं नियमित रूप से उपयोग का एक बेहतर समझ है करने के लिए कोशिश कर रहा हूँ केवल मुझे तथ्य यह है कि एक स्थिर भीतरी वर्ग शीर्ष स्तर वर्ग के रूप में व्यवहार किया जाता है की ओर इशारा किया। सदस्य वर्ग (गैर स्थैतिक) की तुलना में ऐसी चीज का लाभ क्या है? स्थिर भीतरी वर्ग का उपयोग करने का

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    Comment comment = getItem(position); 
    ViewHolder holder; 
    if (convertView == null){ 
     holder = new ViewHolder(); 
     convertView = LayoutInflater.from(context).inflate(R.layout.mylayout, null); 
     holder.nickname = (TextView) ((ViewGroup) convertView).findViewById(R.id.nickname); 
     convertView.setTag(holder); 
    }else{ 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.nickname.setText(comment.getMember_nickname()); 
    CharSequence 
    return convertView; 
} 

public static class ViewHolder{ 
    TextView nickname; 
} 
+5

क्योंकि यदि यह नहीं है, तो वर्ग उदाहरण से जुड़ा हुआ है, जो पूरी तरह से अनैच्छिक है। – njzk2

+0

@ njzk2: नकारात्मक क्या होगा? –

+0

@ Jan1337z नकारात्मकता यह है कि यदि आपके पास व्यूहोल्डर स्थिर नहीं है तो आपके एडाप्टर के प्रत्येक उदाहरण के लिए क्लास ऑब्जेक्ट का उदाहरण है। – njzk2

उत्तर

4

एक लाभ यह है, कि भीतर वर्ग बाहरी वर्ग का एक उदाहरण बिना, स्थिर तरीकों से पहुँचा जा सकता है।

तो भीतरी वर्ग गैर स्थिर:

class MyOuter { 
    private int x = 7; 
    public void makeInner() { 
     MyInner in = new MyInner(); 
     in.seeOuter(); 
    } 
    class MyInner { 
     public void seeOuter() { 
      System.out.println("Outer x is " + x); 
     } 
    } 
} 

public static void main(String[] args) { 
    MyOuter mo = new MyOuter(); 
    MyOuter.MyInner inner = mo.new MyInner(); 
    inner.seeOuter(); 
} 

तो भीतरी वर्ग स्थिर है:

class BigOuter { 
    static class Nest {void go() { System.out.println("hi"); } } 
} 

class Broom { 
    static class B2 {void goB2() { System.out.println("hi 2"); } } 
    public static void main(String[] args) { 
     BigOuter.Nest n = new BigOuter.Nest(); 
     n.go(); 
     B2 b2 = new B2(); 
     b2.goB2(); 
    } 
} 
+2

मुझे यकीन नहीं है कि यह पूरी तरह से व्यूहोल्डर पैटर्न के प्रश्न को संबोधित करता है ... –

+0

@ j0k नाथनज़ ने लिखा: "मेरे रीडिंग्स ने मुझे केवल इस तथ्य की ओर इशारा किया कि एक स्थिर आंतरिक वर्ग को शीर्ष स्तर की कक्षा के रूप में माना जाता है। सदस्य वर्ग (गैर स्थैतिक) की तुलना में ऐसी चीज का लाभ? " मेरा उत्तर दृढ़ता से व्यूहोल्डर पैटर्न को संदर्भित नहीं करता है, मैंने अभी स्थिर स्थैतिक वर्ग को गैर स्थैतिक पर उपयोग करने के लाभों में से एक को इंगित किया है। जहां तक ​​मैं कह सकता हूं, सवाल ViewHolder पैटर्न के मुकाबले स्थिर आंतरिक कक्षाओं का उपयोग करने के लाभों के बारे में अधिक था। –

+0

@IllyesIstvan मुझे लगता है कि आप इगोर को जवाब देना चाहते थे, मुझे नहीं :) – j0k

7

मेरे राय है कि यह ViewHolder वर्ग स्थिर के रूप में यह जीत लिया 'के लिए बेहतर है टी एडाप्टर रिसाव।

यदि एडाप्टर कुछ भारी संग्रह या यहां तक ​​कि दृश्य (प्रत्येक विशेष मामले पर निर्भर करता है) बनाए रखता है, तो यह नियंत्रित करना बहुत अच्छा होगा कि कौन से ऑब्जेक्ट एडाप्टर को बनाए रखते हैं।

एक आंतरिक कक्षा के बहुत से ऑब्जेक्ट उदाहरण होने के कारण उन ऑब्जेक्ट्स एडाप्टर का संदर्भ लेंगे, इस प्रकार इसे बनाए रखा जाएगा। आपको सावधान रहना चाहिए कि टैग कैसे प्रबंधित किए जाते हैं (यदि विचार स्वचालित रूप से साफ़/हटा दिए जाते हैं तो कोई समस्या नहीं है>)।

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