2009-09-23 16 views
7

मेरे पास एक ऐसी गतिविधि है जो ExpandableListActivity को बढ़ाती है। मैं ExpandableListView भरने के लिए SimpleCursorTreeAdapter का उपयोग करता हूं। मेरे लेआउट में सूची दृश्य और खाली दृश्य शामिल है। ऐप पर ExpandableListActivity स्वचालित रूप से प्रदर्शित करने के लिए सही दृश्य चुनता है।विस्तारणीय सूची दृश्य को अपडेट करने के लिए कैसे करें जब एडाप्टर का डेटा बदलता है

मेरे कदम:

  1. अनुप्रयोग शुरू होता है, वहाँ कोई डाटा नहीं है। (स्क्रीन पर खाली दृश्य)
  2. कुछ डेटा डीबी में डालें।
  3. कॉल adapter.notifyDataSetChanged(); लेकिन स्क्रीन पर खाली दृश्य अभी भी है और मेरी सूची दृश्य में कोई आइटम नहीं है।

    1. सूची दृश्य दिखाई देता है:

    तब मैं एप्लिकेशन को पुनः प्रारंभ। मैं सभी समूहों का विस्तार करता हूं और नीचे स्क्रॉल करता हूं।

  4. मैं सूची में आइटम पर क्लिक करता हूं। नई गतिविधि प्रकट होती है।
  5. वापस बटन क्लिक करें। सभी समूह ध्वस्त हो गए हैं और हम स्क्रीन के शीर्ष पर हैं। स्क्रॉल स्थिति और विस्तारित समूहों को याद नहीं किया जाता है।
  6. डीबी से सभी डेटा हटाएं और adapter.notifyDataSetChanged() कॉल करें;
  7. बाल विचार गायब हो गए हैं, लेकिन शीर्ष-स्तरीय समूह अभी भी दिखाई दे रहे हैं।

सवाल:

  1. मैं इस सूची को देखने के साथ खाली दृश्य को बदलने के लिए क्या कर सकते हैं?
  2. समूह की स्थिति को बचाने और सूची दृश्य की स्थिति को स्क्रॉल करने के लिए मैं क्या कर सकता हूं?

SDKs पर परीक्षण किया गया: 1.5r3, 1.6r1

कोड:

public class MainActivity extends ExpandableListActivity { 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     dbHelper = new DBOpenHelper(this); 

     rubricsDbAdapter = new RubricsDBAdapter(dbHelper); 
     rubricsDbAdapter.open(); 

     itemsDbAdapter = new ItemsDBAdapter(dbHelper); 
     itemsDbAdapter.open(); 

     rubricsCursor = rubricsDbAdapter.getAllItemsCursor(); 
     startManagingCursor(rubricsCursor); 

     // Cache the ID column index 
     rubricIdColumnIndex = rubricsCursor.getColumnIndexOrThrow(RubricsDBAdapter.KEY_ID); 

     // Set up our adapter 
     mAdapter = new MyExpandableListAdapter(rubricsCursor, 
       this, 
       android.R.layout.simple_expandable_list_item_1, 
       android.R.layout.simple_expandable_list_item_1, 
       new String[] {RubricsDBAdapter.KEY_NAME}, 
       new int[] {android.R.id.text1}, 
       new String[] {ItemsDBAdapter.KEY_NAME}, 
       new int[] {android.R.id.text1}); 

     setListAdapter(mAdapter); 
    } 

    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 
     Intent i = new Intent(this, ItemViewActivity.class); 
     i.putExtra(ItemsDBAdapter.KEY_ID, id); 
     startActivity(i); 

     return super.onChildClick(parent, v, groupPosition, childPosition, id); 
    } 

    private void updateMyData() { 
     int i; 
     int k; 
     long rubricId; 

     for (i = 1; i <= 5; i++) { 
      rubricId = rubricsDbAdapter.insert("rubric " + i); 
      for (k = 1; k <= 5; k++) { 
       itemsDbAdapter.insert("item " + i + "-" + k, rubricId); 
      } 
     } 

     mAdapter.notifyDataSetChanged(); 
    } 

    private void deleteMyData() { 
     rubricsDbAdapter.deleteAll(); 
     itemsDbAdapter.deleteAll(); 

     mAdapter.notifyDataSetChanged(); 
    } 

    public class MyExpandableListAdapter extends SimpleCursorTreeAdapter 
    { 
     public MyExpandableListAdapter(Cursor cursor, Context context, int groupLayout, 
       int childLayout, String[] groupFrom, int[] groupTo, String[] childrenFrom, 
       int[] childrenTo) { 
      super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childrenFrom, 
        childrenTo); 
     } 

     @Override 
     protected Cursor getChildrenCursor(Cursor notebookCursor) { 
      // Given the group, we return a cursor for all the children within that group 
      long id = notebookCursor.getLong(rubricIdColumnIndex); 

      Cursor itemsCursor = itemsDbAdapter.getRubricItemsCursor(id); 
      startManagingCursor(itemsCursor); 
      return itemsCursor; 
     } 

    } 
} 
+0

कृपया हमें MyExpandableListAdapter के कार्यान्वयन को दिखाएं। – Matthias

+0

कार्यान्वयन ठीक है। कोड के नीचे नीचे स्क्रॉल करें। इसके अलावा, मुझे एहसास हुआ है कि मुझे अपने रूब्रिक कर्सर को मैन्युअल रूप से आवश्यक करने की आवश्यकता है। तो सही कोड होगा: rubricsCursor.requery(); mAdapter.notifyDataSetChanged(); लेकिन दूसरा सवाल अभी भी मुझे चिंता है। –

+0

मैं संभवतः यह नहीं बता सकता कि इस कोड ब्लॉक ने मुझे आज कितना मदद की। मुझे नहीं पता कि मैं इसके बिना क्या करूँगा। बहुत - बहुत धन्यवाद! – dfetter88

उत्तर

4

तो, जवाब है:

  1. कॉल cursor.requery() एडाप्टर के notifyDataSetChanged कॉल करने से पहले() तरीका।
  2. समूह की गतिविधि को रोकें() विधि में सहेजें और रीज़्यूम() विधि में पुनर्स्थापित करें।
2

पुन: प्रश्न # 2 ...

क्यों नहीं आप बस फोन कर सकते हैं View.invalidateViews() और View.requestLayout() इसी क्रम में?

यदि आपके पास पहले से ही आपका एडाप्टर दृश्य में सेट है, तो आपको आवश्यकता की आवश्यकता नहीं है, क्या आप? दृश्य को अमान्य करके, और लेआउट का अनुरोध करके, आप अपने दृश्य के किसी भी राज्य को खो देंगे नहीं।

उदाहरण के लिए, अपने "ऑनस्यूम" विधि में, "lv.invalidateViews()" जैसे कुछ कॉल करके अपनी सूची दृश्य को अमान्य कर दें। इसके बाद, "lv.requestLayout()" पर कॉल करें।

एडेप्टर सेट करने और दृश्य में एडाप्टर को जोड़ने के लिए आपकी "ऑनक्रेट" विधि अभी भी ज़िम्मेदार होनी चाहिए। एडाप्टर को जोड़ने के लिए, पूर्व के बजाय "lv.setListAdapter()" का उपयोग करने पर विचार करें ताकि आप स्क्रीन पर अन्य दृश्यों से गड़बड़ न कर रहे हों।

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