如何在适配器数据更改时更新可扩展列表视图

Evg*_*kov 7 java android

我有一个扩展ExpandableListActivity的活动.我使用SimpleCursorTreeAdapter来填充ExpandableListView.我的布局包含列表视图和空视图.在应用程序启动时,ExpandableListActivity会自动选择要显示的右视图.

我的步骤:

  1. 应用程序启动,没有数据.(屏幕上的空视图)
  2. 将一些数据插入db.
  3. 调用adapter.notifyDataSetChanged(); 但空视图仍然在屏幕上,我的列表视图中没有任何项目.

然后我重启app:

  1. 列表视图出现.我展开所有组并滚动到底部.
  2. 我点击列表中的项目.出现新活动.
  3. 单击后退按钮.所有组都已折叠,我们位于屏幕顶部.滚动位置和扩展组不会被记住.
  4. 从db中删除所有数据并调用adapter.notifyDataSetChanged();
  5. 子视图已消失,但顶级组仍然可见.

问题:

  1. 如何用列表视图替换空视图?
  2. 我该怎么做才能保存组的状态并滚动列表视图的位置?

在SDK上测试: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;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

Evg*_*kov 4

所以,答案是:

  1. 在调用适配器的notifyDataSetChanged()方法之前调用cursor.requery()。
  2. 在 Activity 的 onPause() 方法中保存组状态,并在 onResume() 方法中恢复。