2013-01-20 19 views
5

मैं सरणी एडाप्टर के साथ टुकड़े और सूची दृश्य का उपयोग करने की कोशिश कर रहा हूं, और सरणी एडाप्टर में ऑनक्लिक लिस्टनर से मेरी विधि को कॉल करने में परेशानी हो रही है।क्या मेरा व्यवसाय तर्क खंड या गतिविधि में होना चाहिए?

यदि मैं पैटर्न को सही ढंग से समझता हूं, तो एक टुकड़ा आत्मनिर्भर होना चाहिए, इसलिए मैं वहां अपना व्यावसायिक तर्क रखना चाहता हूं। लेकिन मैं इसे सरणी एडाप्टर से कॉल करने का प्रबंधन नहीं कर सकता। अगर मैं इसे मुख्य गतिविधि में डालता हूं तो मैं इसे कॉल कर सकता हूं, लेकिन क्या यह मुझे किसी अन्य गतिविधि में खंड का उपयोग करने से रोकता है और प्रतिमान को तोड़ता है?

क्या मेरा व्यवसाय तर्क गलत जगह पर है, या क्या मैं इसे सही तरीके से नहीं बुला रहा हूं?

यहां मेरा ऐरे एडाप्टर है;

public class RecipientsListAdapter extends ArrayAdapter<Recipient>{ 

    Context context; 
    int layoutResourceId; 
    Recipient data[] = null; 

    public RecipientsListAdapter(Context context, int layoutResourceId, Recipient[] data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     RecipientHolder holder = null; 

     final boolean isLastRow = (position == data.length-1); 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new RecipientHolder(); 
      holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
      holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); 

      row.setTag(holder); 
     } 
     else 
     { 
      holder = (RecipientHolder)row.getTag(); 
     } 

     final Recipient recipient = data[position]; 
     holder.txtTitle.setText(recipient.displayName); 
     holder.imgIcon.setImageResource(recipient.icon); 

     row.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       ((MainActivity)context).onChildItemSelected(position); 
       if(isLastRow){ 
       //((RecipientsFragment).getContext()).launchContactPicker(); 


        ((MainActivity)context)).launchContactPicker(); 


       } 
       else{ 
        Toast.makeText(getContext(), recipient.displayName, Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 

     return row; 
    } 

उत्तर

2

Adapter क्या किसी भी क्लिक श्रोताओं कहता है, और getView() विधि में एक क्लिक श्रोता संलग्न नहीं किया जाना चाहिए नहीं होना चाहिए। इसके बजाय, आपको ListFragment का उपयोग करना चाहिए, और खंड में onListItemClick() को ओवरराइड करना चाहिए। फिर आप श्रोता इंटरफ़ेस कॉलबैक का आह्वान करके Activity पर उस ईवेंट को प्रेषित कर सकते हैं, या सीधे इसे फ्रैगमेंट के भीतर संभाल सकते हैं। यदि आप एसडीके 11 के रिलीज से पहले एंड्रॉइड संस्करणों का समर्थन करना चाहते हैं तो आप support library का भी उपयोग कर सकते हैं।

2

आपके द्वारा दिए गए संदर्भ को उजागर न करें, यह स्पष्ट रूप से उस विशेष गतिविधि को एडाप्टर को कन्स्ट्रक्टर में घोषित किए बिना जोड़ रहा है हस्ताक्षर।

चूंकि आपके पास इतना मजबूत युग्मन है, या तो RecipientsFragment को कन्स्ट्रक्टर के पैरामीटर के रूप में जोड़ें, या जो जो सुझाता है और onListItemClick का उपयोग Fragment में ListView पर करें। हालांकि, एडाप्टर में OnClickListener एस का उपयोग करने के लिए अक्सर वैध उपयोग होते हैं (उदाहरण के लिए, एकाधिक क्लिक करने योग्य आइटम), इसलिए उन मामलों में आपको केवल फ्रैगमेंट को पास करना होगा।

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

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