2012-07-06 16 views
36

शामिल हो सकता है, जैसा कि सूची सूची के तत्वों को टुकड़े हो सकते हैं। मुझे पता है कि आप एक टेक्स्ट व्यू एक्सएमएल को सूची दृश्य में बदलने के तरीके को बदलने के लिए असाइन कर सकते हैं, लेकिन क्या आप एक सूची दृश्य में टुकड़े जोड़ सकते हैं।क्या एक सूची दृश्य में Fragments

उदाहरण के लिए: मेरे पास एक टुकड़ा है। कहा गया टुकड़ा के लिए एक्सएमएल में एक छवि दृश्य, कुछ बड़े-शैली टेक्स्ट व्यू, और एक छोटी-शैली टेक्स्ट व्यू शामिल है। फ्रैगमेंट क्लास कोड एक बंडल प्राप्त करता है, फिर सामग्री के आधार पर टेक्स्ट व्यू और छवि दृश्य को पॉप्युलेट करता है। फ्रेगमेंट एक्सएमएल और फ्रैगमेंट कोड दोनों बिना समस्या के काम करते हैं (मैं एक व्यक्तिगत टुकड़ा सिर्फ ठीक दिखा सकता हूं)। मेरे पास एक फ्रैगमेंट एक्टिविटी है जिसमें मैं टुकड़ों की उपर्युक्त सूची प्रदर्शित करना चाहता हूं।

ArrayList<Fragment> fragList = new ArrayList<Fragment>(); 
    Fragment fragment = Fragment.instantiate(this, TileItem.class.getName()); 
    Bundle bundle = new Bundle(); 
    bundle.putInt("key", 0); 
    fragment.setArguments(bundle); 
    fragList.add(fragment); 

    ArrayAdapter<Fragment> adapter = new ArrayAdapter<Fragment>(this, R.layout.tile_item, fragList); 
    listItems.setAdapter(adapter); 

यहाँ इस पर सोच के अपने मोड है: यहाँ कोड मैं FragmentActivity के दृश्य के अंदर ListView पॉप्युलेट करने के लिए प्रयास करने के लिए उपयोग कर रहा हूँ है। मैं अपने सभी तत्काल दृश्यों को पकड़ने के लिए टुकड़ों का एक ऐरेलिस्ट बना देता हूं। मैं फिर एक टुकड़ा बनाते हैं, एक बंडल बनाते हैं, बंडल में डेटा जोड़ते हैं (ताकि फ्रैगमेंट मार्शल डेटा को इसके दृश्यों में सही तरीके से कर सके), बंडल को फ्रैगमेंट में जोड़ें, फिर आखिरकार फ्रैगमेंट को ऐरेलिस्ट में जोड़ें। उसके बाद, मैं एक ऐरे एडाप्टर बना देता हूं, उस तत्व लेआउट को जोड़ता हूं जिसे मैं उपयोग करना चाहता हूं, और मैंने जो टुकड़े किए हैं, उनकी सूची; फिर मेरे एडाप्टर से पढ़ने के लिए ListView सेट करें।

कोई भी व्यक्ति जो इस कोड को चला रहा है, वह संभवतः एनपीई @ ArrayAdapter को तत्काल प्राप्त कर देगा। क्या देता है? क्या यह भी संभव है? इससे पहले कि मैं अपने मस्तिष्क को रैकिंग करता हूं, क्या कोई मुझे बता सकता है कि क्या मैं अपना समय बर्बाद कर रहा हूं? क्या कोई बेहतर तरीका है? मैं स्क्रॉलव्यू का उपयोग करने के बारे में सोच रहा हूं, लेकिन लिस्ट व्यू की इतनी सारी कार्यक्षमता को फिर से लागू करने की आवश्यकता होगी और जब आवश्यक नहीं है तो मुझे पहिया को फिर से नफरत करने से नफरत है।

किसी को पढ़ने के लिए धन्यवाद, और विशेष रूप से आपके विचारों के लिए धन्यवाद यदि आप उन्हें छोड़ने का फैसला करते हैं। मैंने इसके लिए एक स्थापित उत्तर के लिए चारों ओर खोज करने की कोशिश की है, लेकिन मुझे लगता है कि एक फ्रेगमेंट के एक सूची दृश्य के उपयोग से संबंधित प्रश्न/वेब पेज हैं; एक सूची दृश्य के तत्वों के रूप में टुकड़ों का उपयोग नहीं करते

संपादित करें: मैंने नीचे दिए गए सुझावों को और अधिक जांच शुरू कर दी। जिस तरह से चीजें दिखाई देती हैं, मैं एक कस्टम एडाप्टर का उपयोग करने में सक्षम होना चाहिए जो एक्सएमएल से केवल फ्लैट आउट बिल्डिंग के बजाय टुकड़ों को बढ़ाता है (प्रक्रिया का वर्णन करने के बेहतर तरीके की कमी के लिए) हालांकि, मेरा वर्तमान कार्यान्वयन सेट करने की कोशिश करते समय एनपीई फेंक रहा है एडाप्टर

यहाँ मेरी कस्टम अनुकूलक (संक्षिप्तता के लिए संक्षिप्त) कोड है:

public class AdapterItem extends ArrayAdapter<Fragment> { 

Context c; 
List<Fragment> f; 

public AdapterItem(Context c, List<Fragment> f) { 
    super(c, R.layout.tile_item, f); 
    this.c = c; 
    this.f = f; 
} 

@Override 
public View getView(int pos, View v, ViewGroup vg) { 
    LayoutInflater i = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    return i.inflate(R.layout.tile_item, vg, false); 
} 

}

और यहाँ मैं इसे कैसे लागू करने कर रहा हूँ है:

ArrayList<Fragment> fragList = new ArrayList<Fragment>(); 
    Fragment fragment = Fragment.instantiate(this, TileItem.class.getName()); 
    Bundle bundle = new Bundle(); 
    bundle.putInt("key", 0); 
    fragment.setArguments(bundle); 
    fragList.add(fragment); 

    AdapterItem adapter = new AdapterItem(this, fragList); 
    adapter.add(fragment); 
    listItems.setAdapter(adapter); 

तो यह कुछ हो गया है दिन और मुझे पूरा यकीन है कि यह धागा दफनाया गया है। हालांकि, मैंने सोचा कि अगर कोई यह कोशिश करना चाहता है तो मैं एक आखिरी अपडेट जोड़ूंगा और एक Google खोज उन्हें यहां लाएगी। तो मेरे कार्यान्वयन में जब सूची सूची को एडाप्टर दिया जाता है तो मुझे एनपीई मिल रहा है। यह पता लगाने के लिए रॉकेट सर्जन नहीं लेता है कि यह निश्चित रूप से एडाप्टर है और सूची दृश्य को फेंकने वाला नहीं है। मेरे जीवन के लिए मैं यह नहीं समझ सकता कि क्यों ...

किसी भी दर पर, मुझे लगता है कि मुझे कुछ विचार है। सबसे पहले, एक छोटी सी कहानी: कुछ समय पहले मैं FragmentDialog के अंदर FragmentTransactions बनाने की कोशिश कर रहा था। हर बार मैंने ऐसा करने का प्रयास किया, मुझे एक एनपीई मिलेगा। आखिरकार, बहुत से शोध के माध्यम से, मैंने पाया कि कारण इस बात से संबंधित है कि टुकड़े किए गए हैं। जब एक टुकड़ा कहा जाता है तो इसे इसके माता-पिता से संदर्भ की आवश्यकता होती है। चूंकि एक संवाद माता-पिता वह गतिविधि है जिसने इसे शुरू किया है, संवाद स्वयं आवश्यक मानदंडों को पूरा नहीं करता है।मेरा मानना ​​है कि जब सूची सूची में टुकड़े जोड़ने का प्रयास करते हैं, तो यह भी मामला है। चूंकि ListView एक टुकड़े को चलाने के साथ समझौते को पूरा नहीं करता है, इसलिए यह एनपीई फेंकता है और इस प्रकार, मुझे लटकता है और सम्मेलनों में वापस जाता है। डी @ एमएन ... मैंने वास्तव में उम्मीद की थी कि मैं ऐसा करने में सक्षम हूं। सरल एक्सएमएल के बजाय टुकड़ों का उपयोग करके सूची को व्यवस्थित/खोजना इतना आसान हो गया होगा। ओह ठीक है ... अनुमान है कि अगर कोई सोच रहा है तो यह नहीं किया जा सकता है।

+2

क्यों तुम भी * चाहते हैं * टुकड़े होने के लिए अनिवार्य रूप से यह नीचे BaseAdapter, जो मेरे उदाहरण में इस तरह दिखता है आता है "एक सूची दृश्य के तत्व"? डेवलपर अपने तत्वों को टुकड़े किए बिना वर्षों के लिए 'ListView' बना रहे हैं। आप उन्हें टुकड़े बनाने से क्या हासिल करने की उम्मीद कर रहे हैं? – CommonsWare

+1

ठीक है, एक के लिए मैं एक सूची के अंदर बस एक साधारण टेक्स्ट व्यू से अधिक दिखाने में सक्षम होने की उम्मीद करता हूं (वास्तव में मैं एक छवि, और पाठ की कुछ अतिरिक्त पंक्तियां दिखाने में सक्षम हूं)। इसके अलावा, मैं कोड को डुप्लिकेट किए बिना विभिन्न गतिविधियों से खंड कोड का पुन: उपयोग करने में सक्षम हूं। मैंने उन वस्तुओं की स्क्रॉलिंग सूचियां भी देखी हैं जो केवल एक साधारण टेक्स्ट व्यू (जैसे Google Play में सूचियों की तुलना में अधिक गतिशील हैं), वे केवल टेक्स्ट व्यू से अधिक जटिल हैं)। यह कैसे प्राप्त किया जाता है? एक टुकड़ा का उपयोग करके वही प्रभाव संभव नहीं होगा (एक आसान)? – user1449018

+3

आप अपनी पंक्तियों के लिए एक्सएमएल से बढ़ाए गए कस्टम एडाप्टर और दृश्यों का उपयोग कर ऐसा कर सकते हैं। –

उत्तर

8

मैं कहूंगा कि सूचीव्यू में एक टुकड़ा डालने के रूप में ऐसा करना संभव नहीं है, इसका मतलब यह होगा कि खंड कई कंटेनरों में गुणा किया जा सकता है। जब आप एक टुकड़ा बनाने के लिए FragmentManager का उपयोग करते हैं, तो इसे पहचानकर्ता के साथ टैग किया जाता है, जिससे इसे फिर से लोड करना और अभिविन्यास और अन्य कॉन्फ़िगरेशन परिवर्तनों पर पुनर्व्यवस्थित करना आसान हो जाता है। यह कई डिवाइस कॉन्फ़िगरेशन में उपयोग को भी प्रोत्साहित करता है।

एक टुकड़ा वास्तव में एक गतिविधि का सबसेट है। क्या आपके पास सूची के हिस्से के रूप में कभी गतिविधि होगी? निश्चित रूप से नहीं (जवाब होना चाहिए!) !!!

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

टिप्पणियों पर बातचीत से, मैं देख सकता हूं कि आप गतिविधि में दृश्य सेटअप कोड और एडाप्टर के अच्छे अलगाव के साथ अच्छा कोड प्राप्त करना चाहते हैं। ऐसा करें:

  1. View कक्षा को ओवरराइड करें और वहां अपना कस्टम ड्राइंग और सेटअप करें।
  2. एक नई कक्षा बनाएं, जिसमें आप एक संदर्भ और डेटा सेट की आवश्यकता होती है जिससे आपको एक सूची को दिखाने की ज़रूरत होती है - यह वही है जो मैं आमतौर पर करता हूं।
  3. अपने वीडियो को कहीं और (मूर्ख) बनाने के लिए कक्षा का उपयोग करें।

बस सूचियों में टुकड़ों का उपयोग न करें। उपयोग के मामले का उपयोग नहीं कर रहे हैं। HTH।

3

आपको टुकड़ों का उपयोग करने की आवश्यकता नहीं है।

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

[इसके अलावा: टिप्पणियों में उत्तर देने वाले लोगों के लिए - यदि आप वास्तव में प्रश्न का उत्तर दे रहे हैं तो कृपया टिप्पणियों के बजाय उत्तर का उपयोग करें! अगर केवल इसलिए कि आपको इस तरह के अधिक प्रतिष्ठा अंक मिलते हैं!]

+0

पीएस: यदि आप किसी अन्य लेआउट के हिस्सों का पुन: उपयोग करने का प्रयास कर रहे हैं, तो element –

7

यह पता चला है कि आप ListView बना सकते हैं जहां सूची में प्रत्येक आइटम दृश्य Fragment है। यह चाल FrameLayout में फ्रैगमेंट को लपेट रही है।

अद्यतन 9/16/2014

भले ही यह संभव है एक ListView कि Fragments होते हैं, यह एक अच्छा विचार है की तरह नहीं दिखता बनाने के लिए। ऐसा लगता है कि एंड्रॉइड दुनिया में निश्चित रूप से एक कोने का मामला है और वहां ड्रेगन हैं। नीचे दिए गए उदाहरण में एक जैसे साधारण टुकड़े के लिए सब कुछ खूबसूरती से काम करता है, लेकिन यदि आपके पास एक जटिल परियोजना है जिसमें बहुत कुछ चल रहा है तो शायद यह जाने का तरीका नहीं है। मेरा नया दृष्टिकोण सभी जीयूआई संबंधित कोड को View में खींचना है जो FrameLayout तक फैलाता है, और इसे ListView में डालें - यह बहुत बेहतर काम करता है और एंड्रॉइड के उपयोग के तरीके के अनुरूप है।यदि आपको अपने कोड के अन्य हिस्सों में Fragment की कार्यक्षमता की आवश्यकता है, तो आप वहां भी इस नए View का उपयोग कर सकते हैं।

मूल जवाब पर वापस ...

मैं अपने AnDevCon 14 Fragments example app के लिए एक नया ManyFragments उदाहरण जोड़ी है, तो आप इसे बाहर की कोशिश करना चाहते।

BaseAdapter adapter = new BaseAdapter() { 
     @Override public int getCount() { return 10000; } 
     @Override public Object getItem(int i) { return new Integer(i); } 
     @Override public long getItemId(int i) { return i; } 

     @Override 
     public View getView(int i, View view, ViewGroup viewGroup) { 

      if (view!=null){ 
       ManyListItemFragment fragment = (ManyListItemFragment) view.getTag(); 
       fragment.setCount(i); 
      } else { 
       FrameLayout layout = new FrameLayout(getActivity()); 
       layout.setLayoutParams(frameLayoutParams); 
       int id = generateViewId(); 
       layout.setId(id); 
       ManyListItemFragment fragment = new ManyListItemFragment(); 
       fragment.setCount(i); 
       getChildFragmentManager() 
         .beginTransaction() 
         .replace(id,fragment) 
         .commit(); 
       view = layout; 
       view.setTag(fragment); 
      } 

      return view; 
     } 
    }; 

मामले में आप उत्सुक हैं यहाँ generateViewId() है::

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) 
public static int generateViewId() { 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     for (;;) { 
      final int result = sNextGeneratedId.get(); 
      // aapt-generated IDs have the high byte nonzero; clamp to the range under that. 
      int newValue = result + 1; 
      if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0. 
      if (sNextGeneratedId.compareAndSet(result, newValue)) { 
       return result; 
      } 
     } 
    } else { 
     return View.generateViewId(); 
    } 
} 
private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1); 
+0

पर एक नज़र डालें, क्या आप मुझे मार्गदर्शन कर सकते हैं कि मुझे प्रत्येक सूची के लिए अलग-अलग लेआउट बनाने का अनुमान है मद – Shadow

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