Android ExpandableListView and SQLite Database

前端 未结 1 2056
余生分开走
余生分开走 2020-11-29 05:42

I have two tables in my database - rooms and devices. Each room can have many devices. I want to make an expandable listview with room name as group and devices name and sta

相关标签:
1条回答
  • 2020-11-29 06:11

    Following is a very simple, no frills expandable list implementation.

    You need two methods in your db helper class to gather the cursors you will need.

    public Cursor fetchGroup() {
        String query = "SELECT * FROM rooms"
        return mDb.rawQuery(query, null);
    }
    
    public Cursor fetchChildren(String room) {
        String query = "SELECT * FROM devices WHERE id_room = '" + room + "'";
        return mDb.rawQuery(query, null);
    }
    

    Then you need to set up your adapter (in your activity):

    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 groupCursor) {
            Cursor childCursor = mDbHelper.fetchChildren(groupCursor.getString(groupCursor.getColumnIndex("id_room"));            
            getActivity().startManagingCursor(childCursor);
            childCursor.moveToFirst();
            return childCursor;
        }
    }
    

    And finally call the adapter and set it to your list (in your activity):

    private void fillData() {
        mGroupsCursor = mDbHelper.fetchGroup();
        getActivity().startManagingCursor(mGroupsCursor);
        mGroupsCursor.moveToFirst();
    
        ExpandableListView elv = (ExpandableListView) getActivity().findViewById(android.R.id.list);
    
        mAdapter = new MyExpandableListAdapter(mGroupsCursor, getActivity(),
            R.layout.rowlayout_expgroup,                     // Your row layout for a group
            R.layout.rowlayout_itemlist_exp,                 // Your row layout for a child
            new String[] { "id_room" },                      // Field(s) to use from group cursor
            new int[] { android.R.id.room },                 // Widget ids to put group data into
            new String[] { "name_device", "state_device" },  // Field(s) to use from child cursors
            new int[] { R.id.device, R.id.state });          // Widget ids to put child data into
    
            lv.setAdapter(mAdapter);                         // set the list adapter.
        }
    }
    

    Hope this helps!

    EDIT

    It should all come together like so:

    public class List_Exp extends Activity {
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            mDbHelper = new YourDB(getActivity());
            mDbHelper.open();
            fillData();
        }
    
        private void fillData() { 
            // set list adapter here
        }
    
        public class MyExpandableListAdapter extends SimpleCursorTreeAdapter {
            // Your adapter
        }
    }
    

    EDIT 2

    To catch clicks, set listeners in you activity:

    lv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
        @Override
        public boolean onChildClick(ExpandableListView parent, View v,
            int groupPosition, int childPosition, long id) {
            // Your child click code here
            return true;
        }
    });
    
    lv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
        @Override
        public boolean onGroupClick(ExpandableListView parent, View v,
            int groupPosition, int groupPosition, long id) {
            // Your group click code here
            return true;
        }
    });
    
    0 讨论(0)
提交回复
热议问题