There is an ExpandableListView drop-down list where countries and their attractions are displayed. Headings are countries, when you click on a country, a drop-down list opens with attractions.
How to make a custom look for these drop-down items themselves.
Created markup for each item from dropdown list
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp"> <de.hdodenhof.circleimageview.CircleImageView xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/img" android:src="@drawable/bg" app:civ_border_color="#FF000000" android:layout_width="42dp" android:layout_height="42dp" android:scaleType="centerCrop" /> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:paddingLeft="8dp" android:paddingRight="8dp"> <TextView android:text="" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/txtTitle" android:layout_weight="1" android:gravity="left|center" /> <TextView android:text="" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/txtHistory" android:layout_weight="1" android:singleLine="true" /> </LinearLayout> <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" app:srcCompat="@drawable/icon_star_outline_black" android:id="@+id/btnfavorite" android:background="@drawable/white_button" android:focusable="false" android:onClick="onFavoriteClick" /> </LinearLayout> </LinearLayout> Class dbhelper
public class DBHeler extends SQLiteOpenHelper { private static String DB_PATH; private static final String DATABASE_NAME = "mydb.db"; private static final int DATABASE_VERSION = 1; public SQLiteDatabase database; private Context myContext; public DBHeler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); this.myContext = context; try { //ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΏΡΡΡ Π΄ΠΎ ΠΠ Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ. DB_PATH = myContext.getDatabasePath(DATABASE_NAME).toString(); createDataBase(); openDataBase(); } catch (IOException e) { e.printStackTrace(); } } public Cursor getCategoryData() { return this.getReadableDatabase().query(Contract.Entry.TABLE_COUNTRY, null, null, null, null, null, null); } public Cursor getSubCategoryData(long categoryID) { return this.getReadableDatabase().query(Contract.Entry.TABLE_DOST, null, Contract.Entry._ID + " = " + categoryID, null, null, null, null); } public void createDataBase() throws IOException { boolean dbExist = checkDataBase(); if (!dbExist) { this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { throw new Error("Error copying database"); } } } private boolean checkDataBase(){ SQLiteDatabase checkDB = null; try { checkDB = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READONLY); } catch (SQLiteException e) { // Π±Π°Π·Π° Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ } if (checkDB != null) { checkDB.close(); } return checkDB != null; } private void copyDataBase() throws IOException { InputStream myInput = myContext.getAssets().open(DATABASE_NAME); String outFileName = DB_PATH; OutputStream myOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer))>0){ myOutput.write(buffer, 0, length); } myOutput.flush(); myOutput.close(); myInput.close(); } public void openDataBase() throws SQLException { database = SQLiteDatabase.openDatabase(DB_PATH, null, SQLiteDatabase.OPEN_READWRITE); } @Override public synchronized void close() { if(database != null) database.close(); super.close(); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } Class MainActivity
public class MainActivity extends AppCompatActivity { ExpandableListView elvMain; DBHeler db; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); db = new DBHeler(this); Cursor categoryData = db.getCategoryData(); startManagingCursor(categoryData); String[] groupFrom = { Contract.Entry.COLUMN_NAME }; int[] groupTo = { android.R.id.text1 }; String[] childFrom = { Contract.Entry.COLUMN_NAME }; int[] childTo = { android.R.id.text1 }; SimpleCursorTreeAdapter sctAdapter = new MyAdapter(this, categoryData, android.R.layout.simple_expandable_list_item_1, groupFrom, groupTo, android.R.layout.simple_list_item_1, childFrom, childTo); elvMain = (ExpandableListView) findViewById(R.id.list); elvMain.setAdapter(sctAdapter); } public class MyAdapter extends SimpleCursorTreeAdapter { public MyAdapter(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); } protected Cursor getChildrenCursor(Cursor groupCursor) { int idColumn = groupCursor.getColumnIndex(Contract.Entry._ID); return db.getSubCategoryData(groupCursor.getInt(idColumn)); } } } Contract class describing fields and column names
public class Contract { private Contract() { }; public static final class Entry implements BaseColumns { public final static String TABLE_DOST = "dost"; public final static String TABLE_COUNTRY = "country"; public final static String _ID = BaseColumns._ID; public final static String COLUMN_NAME = "name"; public final static String COLUMN_OTHER = "other"; public final static String COLUMN_HISTORY = "history"; public final static String COLUMN_IMAGE = "image"; public final static String COLUMN_COUNTRY = "name"; public final static String COLUMN_COUNTRYID = "countryid"; public final static String COLUMN_FAVORITES = "favorites"; } } 
