Прежде всего — DBHelper. У меня есть крошечная БД с двумя таблицами. Сначала укажите название категории, которая может иметь неограниченное количество заголовков подкатегорий.
Код: Выделить всё
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "main";
private static final int DB_VERSION = 1;
private SQLiteDatabase db;
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
this.db = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(String.format("CREATE TABLE IF NOT EXISTS Category (CategoryName CHAR(50) PRIMARY KEY);"));
db.execSQL(String.format("CREATE TABLE IF NOT EXISTS SubCategory (SubCategoryName CHAR(50) PRIMARY KEY, CategoryName CHAR(50), FOREIGN KEY (CategoryName) REFERENCES Category(CategoryName));"));
db.execSQL(String.format("INSERT OR IGNORE INTO Category(CategoryName) VALUES('Games');"));
db.execSQL(String.format("INSERT OR IGNORE INTO SubCategory(SubCategoryName, CategoryName) VALUES('Arcade','Games');"));
}
public Cursor fetchGroup() {
String query = "SELECT * FROM Category";
return db.rawQuery(query, null);
}
public Cursor fetchChildren(String cat) {
String query = "SELECT * FROM SubCategory WHERE CategoryName = '" + cat + "'";
return db.rawQuery(query, null);
}
}
Код: Выделить всё
public class MainActivity extends Activity {
SQLiteDatabase db;
DBHelper mDbh;
ExpandableListAdapter listAdapter;
ExpandableListView expListView;
List listDataHeader;
HashMap listDataChild;
Cursor mGroupsCursor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDbh = new DBHelper(this);
mDbh.onOpen(db);
//mDbh.onCreate(db);
expListView = (ExpandableListView) findViewById(R.id.expandableListView);
fillData();
// preparing list data
//prepareListData();
listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild);
// setting list adapter
//expListView.setAdapter(listAdapter);
// Listview on child click listener
expListView.setOnChildClickListener(new OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
final String str = listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition);
Intent i = new Intent(com.example.senso.readernew.MainActivity.this,SingleListItem.class);
i.putExtra("Name", str);
startActivity(i);
return false;
}
});
}
public class ExpandableListAdapter_DB extends SimpleCursorTreeAdapter {
public ExpandableListAdapter_DB(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 = mDbh.fetchChildren(groupCursor.getString(groupCursor.getColumnIndex("Category")));
startManagingCursor(childCursor);
childCursor.moveToFirst();
return childCursor;
}
}
private void fillData()
{
mGroupsCursor = mDbh.fetchGroup();
startManagingCursor(mGroupsCursor);
mGroupsCursor.moveToFirst();
expListView = (ExpandableListView)this.findViewById(R.id.expandableListView);
ExpandableListAdapter_DB mAdapter = new ExpandableListAdapter_DB(mGroupsCursor,this,
R.layout.list_group,
R.layout.list_item,
new String[]{"CategoryName"},
new int[]{R.id.lblListHeader},
new String[]{"SubCategoryName"},
new int[]{R.id.lblListItem});
expListView.setAdapter(mAdapter);
}
}
11-15 17:04:43.036 21404-21404/com.example.senso.readernew
E/CursorWindow: не удалось прочитать строку 0, столбец -1 из CursorWindow
, который имеет 1 ряд, 1 columns.
11-15 17:04:43.046 21404-21404/com.example.senso.readernew E/AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: main
11-15 17:04:43.046 21404-21404/com.example.senso.readernew E/AndroidRuntime: Процесс: com.example.senso.readernew, PID: 21404
11-15 17:04:43.046 21404-21404/com.example.senso.readernew E/AndroidRuntime: java.lang.RuntimeException: невозможно начать действие
ComponentInfo{com.example.senso.readernew/com.example.senso.readernew.MainActivity}:
java.lang.IllegalStateException: не удалось прочитать строку 0, столбец -1 из
CursorWindow. Прежде чем
получить доступ к данным из него, убедитесь, что курсор правильно инициализирован.
11-15 17:04:43.046 21404-21404/com.example.senso.readernew E/AndroidRuntime: Причина: java.lang.IllegalStateException:
Не удалось прочитать строку 0, столбец -1 из КурсорОкно. Прежде чем обращаться к данным из него, убедитесь, что курсор
правильно инициализирован.
11-15 17:04:43.046 21404-21404/com.example.senso.readernew E/AndroidRuntime: at
com.example.senso.readernew.MainActivity.fillData(MainActivity.java:162)
11–15 17:04:43.046 21404-21404/com.example.senso.readernew E/AndroidRuntime: at
com.example.senso.readernew.MainActivity.onCreate(MainActivity.java:46)
Заранее спасибо!
P.S. Я написал свой код, изучая один код Android ExpandableListView и базы данных SQLite.
Подробнее здесь: https://stackoverflow.com/questions/337 ... on-android
Мобильная версия