Android ExpandableListView y base de datos SQLite
Tengo dos tablas en mi base de datos – habitaciones y dispositivos. Cada habitación puede tener muchos dispositivos. Quiero hacer un listview expandible con nombre de sala como grupo y dispositivos de nombre y estado como niños (encendido o apagado).
¿Puede alguien darme una idea simple porque soy un poco nuevo con Android y todos los tutoriales son difíciles de hacer
- SQLiteOpenHelper no puede llamar a onCreate?
- Android: utiliza UUID como clave principal en SQLite
- Eliminar todas las filas de tabla de la tabla de base de datos SQLite
- Error de Android escribiendo datos de ubicación en la base de datos SQLite de la clase LocationListener
- Acceda a la base de datos en una clase que no sea de actividad
Esta es mi base de datos:
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" + ");"); }
- Idioma para cerrar un cursor
- Problema de almacenamiento de datos de Android
- Actualización de la imagen del perfil del usuario
- Tablas de relación en sqlite en android
- Android: ¿Dónde se almacenan los archivos de base de datos?
- Agregar una columna a la tabla de SQLite en Android?
- Android: SQLite usando base de datos incorrecta
- Cómo utilizar una base de datos existente con una aplicación de Android
A continuación se muestra una implementación de lista expandible muy sencilla.
Necesita dos métodos en la clase auxiliar de db para recopilar los cursores que necesitará.
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); }
A continuación, debe configurar su adaptador (en su actividad):
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; } }
Y, finalmente, llamar al adaptador y configurarlo en su lista (en su actividad):
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. } }
¡Espero que esto ayude!
EDITAR
Todo debería unirse así:
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
Para capturar clics, configure a los oyentes en su actividad:
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; } });
- Ninguna aplicación puede realizar esta acción, al enviar correo electrónico
- Controla el LED Android desde el shell