2012-05-17 6 views
7

Ich habe zwei Tabellen in meiner Datenbank - Räume und Geräte. Jedes Zimmer kann viele Geräte haben. Ich möchte eine erweiterbare Listenansicht mit Raumnamen als Gruppen- und Gerätenamen erstellen und als untergeordnete Elemente (on oder off) angeben.Android ExpandableListView und SQLite-Datenbank

Kann jemand mir eine einfache Idee geben, weil ich irgendwie bin hier mit Android und alle Tutorials sind hart

Dies ist meine Datenbank zu machen:

public void onCreate(SQLiteDatabase db) { 
     db.execSQL("create table if not exists rooms (
            id_room integer primary key autoincrement, " 
       + "name_room text not null" 
       + ");");  
     db.execSQL("create table if not exists devices (
            id_device integer primary key autoincrement, " 
       + "name_device text not null," 
       + "state_device text not null," 
       + "id_room references rooms" 
       + ");"); 
    } 

Antwort

13

Es folgt eine sehr einfach, kein Implementierung der erweiterbaren Listen der Rüschen.

Sie benötigen zwei Methoden in Ihrer db-helfer-Klasse, um die Cursor zu sammeln, die Sie benötigen.

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); 
} 

Dann müssen Sie Ihren Adapter einzurichten (in Ihrer Tätigkeit):

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; 
    } 
} 

Und schließlich den Adapter anrufen und setzen Sie ihn auf Ihrer Liste (in Ihrer Tätigkeit):

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. 
    } 
} 

Hoffe, das hilft!

EDIT

Es sollte alle zusammen kommen, wie 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

Klicks zu fangen, setzen Zuhörer in Ihnen Aktivität:

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

Ich muss t entfernen seine getActivity(). startManagingCursor (childCursor) auf der getChildrenCursor(), weil ich keine Lösung zum Entfernen von Fehler haben Die Methode getActivity() ist nicht definiert für den Typ MyExpandableListAdapter !! –

+0

Ah, dieser Code war in einem Fragment, also würde es dort funktionieren. Sie könnten versuchen, stattdessen "this" oder "youractivity.this" zu verwenden. – Barak

+0

Ich habe versucht, dies zu verwenden, aber Sie können sehen, dass MyExpandableListAdapter() keine Aktivität ist ?? !! –