I'm trying to make an expendable list view with the header text being extratced from column "Organ features" and child text is extratced from the pharynx column, this is my database structure:
I want organ features to be displayed as header only if their childlist(= instances from the pharynx colum) are NOT NULL. This is what i got so far (as you see, the venous drainage is empty in pharynx column but still displayed as header, and i dont want that):
i Think i should add a statment " if(DATABASECHILD_1 != null)" or something like that ..
Thanks for the help!
Database.Java
package ma.ac.iav.learn;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;
public class Database {
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "URTdd.db";
private static final String DATABASE_TABLE = "OrganAnatomy";
public static final String DATABASE_ID = "_id";
public static final String DATABASE_GROUP_1 = "Organ_features";
public static final String DATABASE_CHILD_1 = "Pharynx";
private final Context mContext;
private DatabaseHelper mDatabaseHelper;
private SQLiteDatabase mDB;
public Database(Context context) {
mContext = context;
}
public void open() {
mDatabaseHelper = new DatabaseHelper(mContext, DATABASE_NAME, null, DATABASE_VERSION);
mDB = mDatabaseHelper.getWritableDatabase();
}
public void close() {
if (mDatabaseHelper != null) mDatabaseHelper.close();
}
public Cursor getDatabase() {
return mDB.query(DATABASE_TABLE, null, null, null, null, null, DATABASE_GROUP_1);
}
public Cursor getID(long rowID) {
return mDB.query(DATABASE_TABLE, null, "_id" + " = "
+ rowID, null, null, null, null);
}
public class DatabaseHelper extends SQLiteAssetHelper {
public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
}
}
MainActivity.java
package ma.ac.iav.learn;
import android.content.Context;
import android.database.Cursor;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ExpandableListView;
import android.widget.SimpleCursorTreeAdapter;
public class MainActivity extends AppCompatActivity {
ExpandableListView expandableListView;
Database mDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
"Called when the database has been opened."
https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onOpen(android.database.sqlite.SQLiteDatabase)
*/
mDatabase = new Database(this);
mDatabase.open();
/*
"This interface provides random read-write access to the result set returned by a database query."
https://developer.android.com/reference/android/database/Cursor.html
*/
Cursor cursor = mDatabase.getDatabase();
startManagingCursor(cursor);
/*
"A list of column names that will be used to display the data for a group."
"The group views (from the group layouts) that should display column in the "from" parameter."
"A list of column names that will be used to display the data for a child."
"The resource identifier of a layout file that defines the views for a child."
https://developer.android.com/reference/android/widget/SimpleCursorTreeAdapter.html#SimpleCursorTreeAdapter(android.content.Context, android.database.Cursor, int, java.lang.String[], int[], int, java.lang.String[], int[])
*/
String[] groupFrom = {
Database.DATABASE_GROUP_1,
};
int[] groupTo = {
R.id.group1,
};
String[] childFrom = new String[]{
Database.DATABASE_CHILD_1,
};
int[] childTo = {
R.id.child1,
};
/*
"An easy adapter to map columns from a cursor to TextViews or ImageViews defined in an XML file."
https://developer.android.com/reference/android/widget/SimpleCursorTreeAdapter.html
*/
SimpleCursorTreeAdapter simplecursortreeAdapter = new ExpandableListViewAdapter(
this,
cursor,
R.layout.list_group,
groupFrom,
groupTo,
R.layout.list_child,
childFrom,
childTo
);
/*
"Finds a view that was identified by the android:id XML attribute that was processed in onCreate(Bundle)."
"Sets the adapter that provides data to this view."
https://developer.android.com/reference/android/app/Activity.html#findViewById(int)
https://developer.android.com/reference/android/widget/ExpandableListView.html#setAdapter(android.widget.ExpandableListAdapter)
*/
expandableListView = findViewById(R.id.expandableListview);
expandableListView.setAdapter(simplecursortreeAdapter);
}
/*
"Closes the Cursor, releasing all of its resources and making it completely invalid."
https://developer.android.com/reference/android/database/Cursor.html#close()
*/
protected void onDestroy() {
super.onDestroy();
mDatabase.close();
}
private class ExpandableListViewAdapter extends SimpleCursorTreeAdapter {
private ExpandableListViewAdapter(
Context context,
Cursor cursor,
int groupLayout,
String[] groupFrom,
int[] groupTo,
int childLayout,
String[] childFrom,
int[] childTo) {
super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childFrom, childTo);
}
/*
"Gets the Cursor for the children at the given group."
https://developer.android.com/reference/android/widget/CursorTreeAdapter.html#getChildrenCursor(android.database.Cursor)
*/
protected Cursor getChildrenCursor(Cursor groupCursor) {
return mDatabase.getID(groupCursor.getInt(groupCursor.getColumnIndex(Database.DATABASE_ID)));
}
}
}