2010-10-28 13 views
13

मेरे पास एक बाल गतिविधि है जिसमें ListView है। यह गतिविधि एक SQLite कर्सर से अतुल्यकालिक रूप से आबादी है। सूची आइटम में टेक्स्ट व्यू, एक रेडियो बटन, और एक सामान्य बटन होता है। एक्सएमएल नीचे दिखाया गया है:कैसे पता चलेगा कि एंड्रॉइड लिस्ट व्यू पॉप्युलेट किया गया है

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout android:id="@+id/rlCategoryListItemLayout" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> 
<TextView android:id="@+id/tvCategoryListItemTitle" style="@style/uwLargeListItemLabelStyle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:singleLine="true" android:text="This is a test note title" /> 
<LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentRight="true" android:gravity="center_vertical"> 
    <RadioButton android:id="@+id/rdoCategoryListItemSelect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginRight="10dip" /> 
    <Button android:id="@+id/btnCategoryListItemDelete" android:background="@drawable/delete_red" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" /> 
</LinearLayout> 
</RelativeLayout> 

मैं कुछ तर्क करने के लिए निर्धारित करने के लिए जो RadioButton डिफ़ॉल्ट रूप से चयनित है, और मुझे यह नहीं कर सकते जब तक ListView पहले से ही भरी हुई है। समस्या यह है कि मैंने उन सभी घटनाओं के साथ अब तक कोशिश की है (ऑनक्रेट, ऑनपोस्टक्रेट, ऑनर्यूम, ऑन विन्डोफोकस चेंजेड), लिस्ट व्यू बाल गणना शून्य है। मैंने ArrayAdapter क्लास में getView विधि का उपयोग करने का भी प्रयास किया है, लेकिन उस विधि को कई बार बुलाया जाता है और ListView बाल गणना हर बार संभावित रूप से भिन्न होती है, जिससे अप्रत्याशित परिणाम होते हैं। जाहिर है, सूची घटनाएं अपने बच्चे के सामानों के साथ पूरी तरह से पॉप्युलेट होने से पहले इन घटनाओं को फायरिंग कर रही हैं।

क्या कोई ऐसी घटना है जिसके बारे में मैं सुन सकता हूं, या यह निर्धारित करने का कोई अन्य तरीका है कि ListView पॉप्युलेटिंग कब समाप्त हो गया है और क्या इसके सभी बच्चे प्रोग्रामेटिक रूप से संशोधित किए जा सकते हैं?

धन्यवाद!

उत्तर

1

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

यदि आप अपने ऐप के बारे में थोड़ी अधिक जानकारी में जाते हैं और कुछ कोड पोस्ट करते हैं तो यह आपकी मदद कर सकता है।

+1

धन्यवाद, एलिविन। मुझे बस डिफ़ॉल्ट रूप से रेडियोबॉटन में से एक का चयन करना होगा। जब मैं ऐसा करने की कोशिश करता हूं, हालांकि, ListView में अभी तक बाल आइटम नहीं दिखते हैं। इसलिए, मुझे यह जानना होगा कि ListView पूरी तरह से आबादी कब है, इसलिए मैं सूची में से किसी एक आइटम में जा सकता हूं और चयन कर सकता हूं। – mahdaeng

+0

मेरा बिंदु यह है कि "ListView पूरी तरह से आबादी वाला है" का अर्थ स्पष्ट नहीं है। यदि इसका मतलब है कि सूची में सभी आइटम दिखाई दे रहे हैं, तो उस स्थिति को कभी भी सूची दृश्य प्रस्तुत पंक्तियों के तरीके से नहीं दिया जा सकता है। – elevine

+0

हां - यही मेरा मतलब है। :^( – mahdaeng

2

डेटाबेस पर आपके असीमित काम के अंत में, आप मुख्य थ्रेड पर वापस कोड चलाने के लिए हैंडलर.post (Runnable) का उपयोग कर सकते हैं। यह लगभग कॉलबैक ट्रिगर करने की तरह है और आप गारंटी दे सकते हैं कि सूची पॉप्युलेट होने के बाद यह चलेगी। यदि आप सब कुछ सावधानी से समय की आवश्यकता है तो आप एक निश्चित समय पर रननेबल को भी शेड्यूल कर सकते हैं।

क्या यह सहायक था?

+0

धन्यवाद, mtmurdock। मैं वहां कुछ चीजों की कोशिश करूंगा और देख सकता हूं कि मैं किसके साथ आ सकता हूं। मैं अपने परिणामों पर वापस रिपोर्ट करूंगा। – mahdaeng

+0

उन पंक्तियों के साथ एक और विकल्प AsyncTask का उपयोग करना है: http: // developer .android.com/संदर्भ/एंड्रॉइड/ओएस/AsyncTask.html – elevine

+0

जैसा कि यह निकला, मेरे कोड में कहीं और सूक्ष्म बग था। जाहिर है, मैं अपने रननेबल को ठीक से फायर कर रहा था जब मुझे होना चाहिए था, लेकिन दूसरी बग थी ऐसा लगता है कि कुछ नियंत्रण अभी तक तैयार नहीं थे। धन्यवाद, mtmurdock और elevine, इस के साथ मेरी मदद करने की आपकी इच्छा के लिए। – mahdaeng

0

आप एक स्ट्रिंग चर अपनी गतिविधि में (जैसे public static String END_LOAD) अपनी गतिविधि में, जोड़ सकते हैं और अपने getView विधि में मूल्य (अनुकूलक में) निर्धारित करते हैं, तो बाद

ListView listView = (ListView) findViewById(R.id.recordListView); 
     listView.setAdapter(adapter); 

आप एक साधारण धागा जोड़ सकते हैं

Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     while (END_LOAD == null || END_LOAD .equals("")) { // your conditions 
     } 
     createReadRequest(); // your task to execute 
    } 
}; 

new Thread(runnable).start(); 

एक सरल शर्त यह है कि आप के लिए दिलचस्प हो सकता है, तो जब हालत झूठी होगा, क्योंकि getView विधि से किया जाता है, अब आप अपने विशिष्ट प्रक्रिया कर सकते हैं जोड़ें: कि END_LOAD चर जाँच हो जाएगा।

+0

END_LOAD क्या है? और मैं इसे कैसे प्राप्त कर सकता हूं? –

6

आप इस तरह इस कार्य को पूरा करने, एक हैंडलर का उपयोग कर सकते हैं:

अपनी गतिविधि में किसी अन्य संपत्ति के रूप में हैंडलर जोड़ें।

private Handler mListViewDidLoadHanlder = new Handler(new Handler.Callback() { 
    @Override 
    public boolean handleMessage(Message message) { 
     //Do whatever you need here the listview is loaded 
     return false; 
    } 
}); 

और अपने सूचीदृश्य एडाप्टर के getView विधि के अंदर आप तुलना कर वर्तमान स्थिति पिछले एक हुआ या नहीं, हां, तो यह खत्म हो (सिर्फ वापसी से पहले इसे रखा है) होगा:

public View getView(int position, View convertView, ViewGroup parent) { 
     //Your views logic here 

     if (position == mObjects.size() - 1) { 
       mViewDidLoadHanlder.sendEmptyMessage(0); 
      } 

     return convertView; 
    } 
+4

आपके डेटा का आकार (mObjects) getView में प्रदर्शित होने वाली वास्तविक संख्या से संबंधित नहीं है। – AndroidDev

+0

कोई 'getView' नहीं है ('मेरी 'ListView.java' में; जहां वह विधि है? – msysmilu

+0

आप सही हैं, यह आपके एडाप्टर में है। Http://developer.android.com/reference/android/widget/ArrayAdapter .html # getView (int, android.view.View, android.view.ViewGroup) –