package com.jstappdev.dbclf; import android.content.Context; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Typeface; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.ImageView; import android.widget.SectionIndexer; import android.widget.TextView; import java.io.IOException; import java.io.InputStream; import java.text.Collator; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; public class ListAdapter extends BaseExpandableListAdapter implements SectionIndexer { private Context context; private List<String> listDataHeader; // header titles // child data in format of header title, child title private HashMap<String, String> listDataChild; // index for side index list private HashMap<String, Integer> mapIndex; private String[] sections; ListAdapter(Context context, List<String> listDataHeader, HashMap<String, String> listChildData) { this.context = context; this.listDataHeader = listDataHeader; this.listDataChild = listChildData; // HashMap will prevent duplicates mapIndex = new LinkedHashMap<String, Integer>(); for (int i = listDataHeader.size() - 1; i >= 0; i--) { mapIndex.put(listDataHeader.get(i).substring(0, 1).toUpperCase(Locale.getDefault()), i); } // create a list from the set to sort final ArrayList<String> sectionList = new ArrayList<String>(mapIndex.keySet()); final Collator coll = Collator.getInstance(Locale.getDefault()); coll.setStrength(Collator.PRIMARY); Collections.sort(sectionList, coll); sections = new String[sectionList.size()]; sectionList.toArray(sections); } private static Bitmap getBitmapFromAsset(Context context, String filePath) { final AssetManager assetManager = context.getAssets(); InputStream istr; Bitmap bitmap = null; try { istr = assetManager.open(filePath); bitmap = BitmapFactory.decodeStream(istr); } catch (IOException e) { try { istr = assetManager.open("nodata.jpg"); bitmap = BitmapFactory.decodeStream(istr); } catch (IOException ignored) { } } return bitmap; } @Override public Object getChild(int groupPosition, int childPosititon) { return this.listDataChild.get(this.listDataHeader.get(groupPosition)); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final String childText = (String) getChild(groupPosition, childPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this.context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_item, parent, false); } final ImageView imageViewListChild = convertView.findViewById(R.id.breed_image); imageViewListChild.setImageBitmap(getBitmapFromAsset(context, childText)); return convertView; } @Override public int getChildrenCount(int groupPosition) { if (this.listDataChild.get(this.listDataHeader.get(groupPosition)) != null) return 1; else return 0; } @Override public Object getGroup(int groupPosition) { return this.listDataHeader.get(groupPosition); } @Override public int getGroupCount() { return this.listDataHeader.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { final String headerTitle = (String) getGroup(groupPosition); if (convertView == null) { LayoutInflater infalInflater = (LayoutInflater) this.context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = infalInflater.inflate(R.layout.list_group, parent, false); } final TextView lblListHeader = convertView.findViewById(R.id.lblListHeader); lblListHeader.setTypeface(null, Typeface.BOLD); lblListHeader.setText(headerTitle); return convertView; } @Override public boolean hasStableIds() { return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } public int getPositionForSection(int section) { //noinspection ConstantConditions return mapIndex.get(sections[section]); } public int getSectionForPosition(int position) { return 0; } public Object[] getSections() { return sections; } }