Expandable ListView In PSLab Android App
In the PSLab Android App, we show a list of experiments for the user to perform or refer to while performing an experiment, using PSLab hardware device. A long list of experiments need to be subdivided into topics like Electronics, Electrical, School Level, Physics, etc. In turn, each category like Electronics, Electrical, etc can have a sub-list of experiments like:
- Electronics
- Diode I-V characteristics
- Zener I-V characteristics
- Transistor related experiments
- Electrical
- Transients RLC
- Bode Plots
- Ohm’s Law
This list can continue in similar fashion for other categories as well. We had to display this experiment list to the users with a good UX, and ExpandableListView seemed the most appropriate option.
ExpandableListView is a two-level listView. In the Group view an individual item can be expanded to show it’s children. The Items associated with ExpandableListView come from ExpandableListAdapter.
Implementation of Experiments List Using ExpandableListView
First, the ExpandableListView was declared in the xml layout file inside some container like LinearLayout/RelativeLayout.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ExpandableListView android:id="@+id/saved_experiments_elv" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@color/colorPrimaryDark" android:dividerHeight="2dp" /> </LinearLayout>
Then we populated the data onto the ExpandableListView, by making an adapter for ExpandableListView by extending BaseExpandableListAdapter and implementing its methods. We then passed a Context, List<String> and Map<String,List<String>> to the Adapter constructor.
Context: for inflating the layout
List<String>: contains titles of unexpanded list
Map<String,List<String>>: contains sub-list mapped with title string
public SavedExperimentAdapter(Context context, List<String> experimentGroupHeader, HashMap<String, List<String>> experimentList) { this.context = context; this.experimentHeader = experimentGroupHeader; this.experimentList = experimentList; }
In getGroupView() method, we inflate, set title and return group view i.e the main list that we see on clicking and the sub-list is expanded. You can define your own layout in xml and inflate it. For PSLab Android, we used the default one provided by Android
android.R.layout.simple_expandable_list_item_2
@Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { String headerTitle = (String) getGroup(groupPosition); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(android.R.layout.simple_expandable_list_item_2, null); } TextView tvExperimentListHeader = (TextView) convertView.findViewById(android.R.id.text1); tvExperimentListHeader.setTypeface(null, Typeface.BOLD); tvExperimentListHeader.setText(headerTitle); TextView tvTemp = (TextView) convertView.findViewById(android.R.id.text2); tvTemp.setText(experimentDescription.get(groupPosition)); return convertView; }
Similarly, in getChildView() method, we inflate, set data and return child view. We wanted simple TextView as sub-list item thus inflated the layout containing only TextView and setText by taking reference of textView from the inflated view.
@Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { String experimentName = (String) getChild(groupPosition, childPosition); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.experiment_list_item, null); } TextView tvExperimentTitle = (TextView) convertView.findViewById(R.id.exp_list_item); tvExperimentTitle.setText(experimentName); return convertView; }
The complete code for the Adapter can be seen here.
After creating the adapter we proceeded similarly to the normal ListView. Take the reference for ExpandableListView by findViewById() or BindView if you are using ButterKnife and set the adapter as an instance of adapter created above.
@BindView(R.id.saved_experiments_elv) ExpandableListView experimentExpandableList; experimentAdapter = new SavedExperimentAdapter(context, headerList, map); experimentExpandableList.setAdapter(experimentAdapter);
Roadmap
We are planning to divide the experiment sub-list into categories like
- Electronics
- Diode
- Diode I-V
- Zener I-V
- Diode Clamping
- Diode Clipping
- BJT and FET
- Transistor CB (Common Base)
- Transistor CE (Common Emitter)
- Transistor Amplifier
- N-FET output characteristic
- Op-Amps
- …
- Diode
- Electrical
- …
This is a bit more complex than it looks, I tried using an ExpandableListView as a child for a group item but ran into some errors. I will write a post as soon as this view hierarchy has been achieved.
You must be logged in to post a comment.