Android ExpandableListView和SQLite数据库
我的数据库中有两个表——房间和设备。每个房间可以有许多设备。我想制作一个可扩展的列表视图,其中房间名称作为组,设备名称和状态作为子项(打开或关闭) 有谁能给我一个简单的想法,因为我对Android有点陌生,而且所有的教程都很难制作 这是我的数据库:Android ExpandableListView和SQLite数据库,android,sqlite,expandablelistview,Android,Sqlite,Expandablelistview,我的数据库中有两个表——房间和设备。每个房间可以有许多设备。我想制作一个可扩展的列表视图,其中房间名称作为组,设备名称和状态作为子项(打开或关闭) 有谁能给我一个简单的想法,因为我对Android有点陌生,而且所有的教程都很难制作 这是我的数据库: public void onCreate(SQLiteDatabase db) { db.execSQL("create table if not exists rooms (
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"
+ ");");
}
下面是一个非常简单的、没有虚饰的可扩展列表实现 在db helper类中需要两个方法来收集所需的游标
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);
}
然后,您需要设置适配器(在活动中):
最后调用适配器并将其设置为您的列表(在活动中):
希望这有帮助
编辑
所有这些都应该像这样结合在一起:
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
}
}
编辑2
要捕获单击,请在活动中设置侦听器:
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;
}
}
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.
}
}
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;
}
});
我必须删除getChildrenCursor()上的getActivity().startManagingCursor(childCursor),因为我没有任何可删除错误的解决方案。MyExpandableListAdapter类型的getActivity()方法未定义!!啊,那个代码是在一个片段中,所以它可以在那里工作。您可以尝试改用
此
或您的活动。此
。我尝试过使用此功能,但正如您看到的,MyExpandableListAdapter()不是活动??!!啊,我想我明白你的问题了。。。MyExpandableListAdapter需要包含在活动中,它不是自己的类。适配器应该与调用它的列表处于同一活动中。我将修改我的答案来解释这一点。然后,name\u device
或state\u device
列中的一列(或两列)不存在于光标中。因为我们使用SELECT*
拉取了所有列,所以它们应该在那里。我记下了你在原始帖子中显示的列名。您需要找出正确的名称并使用它们。或者您可以只使用索引引用(0和1)。