मेरे पास एक ऐसी गतिविधि है जो ExpandableListActivity को बढ़ाती है। मैं ExpandableListView भरने के लिए SimpleCursorTreeAdapter का उपयोग करता हूं। मेरे लेआउट में सूची दृश्य और खाली दृश्य शामिल है। ऐप पर ExpandableListActivity स्वचालित रूप से प्रदर्शित करने के लिए सही दृश्य चुनता है।विस्तारणीय सूची दृश्य को अपडेट करने के लिए कैसे करें जब एडाप्टर का डेटा बदलता है
मेरे कदम:
- अनुप्रयोग शुरू होता है, वहाँ कोई डाटा नहीं है। (स्क्रीन पर खाली दृश्य)
- कुछ डेटा डीबी में डालें।
- कॉल adapter.notifyDataSetChanged(); लेकिन स्क्रीन पर खाली दृश्य अभी भी है और मेरी सूची दृश्य में कोई आइटम नहीं है।
- सूची दृश्य दिखाई देता है:
तब मैं एप्लिकेशन को पुनः प्रारंभ। मैं सभी समूहों का विस्तार करता हूं और नीचे स्क्रॉल करता हूं।
- मैं सूची में आइटम पर क्लिक करता हूं। नई गतिविधि प्रकट होती है।
- वापस बटन क्लिक करें। सभी समूह ध्वस्त हो गए हैं और हम स्क्रीन के शीर्ष पर हैं। स्क्रॉल स्थिति और विस्तारित समूहों को याद नहीं किया जाता है।
- डीबी से सभी डेटा हटाएं और adapter.notifyDataSetChanged() कॉल करें;
- बाल विचार गायब हो गए हैं, लेकिन शीर्ष-स्तरीय समूह अभी भी दिखाई दे रहे हैं।
सवाल:
- मैं इस सूची को देखने के साथ खाली दृश्य को बदलने के लिए क्या कर सकते हैं?
- समूह की स्थिति को बचाने और सूची दृश्य की स्थिति को स्क्रॉल करने के लिए मैं क्या कर सकता हूं?
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;
}
}
}
कृपया हमें MyExpandableListAdapter के कार्यान्वयन को दिखाएं। – Matthias
कार्यान्वयन ठीक है। कोड के नीचे नीचे स्क्रॉल करें। इसके अलावा, मुझे एहसास हुआ है कि मुझे अपने रूब्रिक कर्सर को मैन्युअल रूप से आवश्यक करने की आवश्यकता है। तो सही कोड होगा: rubricsCursor.requery(); mAdapter.notifyDataSetChanged(); लेकिन दूसरा सवाल अभी भी मुझे चिंता है। –
मैं संभवतः यह नहीं बता सकता कि इस कोड ब्लॉक ने मुझे आज कितना मदद की। मुझे नहीं पता कि मैं इसके बिना क्या करूँगा। बहुत - बहुत धन्यवाद! – dfetter88