1

I am trying to make an Expanded List View ideally with check boxes, something for settings.

But for some reason its not working to well for me.

I have tried many different tutorials and spent a many hours on it. But they all seem to end the same way. It shows up on my activity but it does not expand or collapse.

here is my code for the settings.XML:

<ExpandableListView
 android:id="@+id/lvExp"
 android:layout_height="match_parent"
 android:layout_width="match_parent"/>

Here is my code for the parent XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp"
android:background="#000000">


<TextView
    android:id="@+id/lblListHeader"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="?
    android:attr/expandableListPreferredItemPaddingLeft"
    android:textSize="17dp"
    android:textColor="#f9f93d" />

</LinearLayout>

Here is my code for the child XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="55dip"
 android:orientation="vertical" >

<TextView
    android:id="@+id/lblListItem"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="17dip"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:paddingLeft="?
    android:attr/expandableListPreferredChildPaddingLeft" />

</LinearLayout>

Here is my Expandable List Adapter

package com.example.edonfreiner.siddur;

import java.util.HashMap;
import java.util.List;

import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

public class ExpandableListAdapter extends BaseExpandableListAdapter {

private Context _context;
private List<String> _listDataHeader; // header titles
// child data in format of header title, child title
private HashMap<String, List<String>> _listDataChild;

public ExpandableListAdapter(Context context, List<String> 
listDataHeader,
                             HashMap<String, List<String>> 
listChildData) {
    this._context = context;
    this._listDataHeader = listDataHeader;
    this._listDataChild = listChildData;
}

@Override
public Object getChild(int groupPosition, int childPosititon) {
    return 
this._listDataChild.get(this._listDataHeader.get(groupPosition))
            .get(childPosititon);
}

@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, null);
    }

    TextView txtListChild = (TextView) convertView
            .findViewById(R.id.lblListItem);

    txtListChild.setText(childText);
    return convertView;
}

@Override
public int getChildrenCount(int groupPosition) {
    return 
this._listDataChild.get(this._listDataHeader.get(groupPosition))
            .size();
}

@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) {
    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, null);
    }

    TextView lblListHeader = (TextView) 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;
}
}

So far I could even get this to work, let alone place check boxes in it, which I hope is easier.

enter image description here

Community
  • 1
  • 1
Edon Freiner
  • 338
  • 2
  • 17
  • So, do you see only the parent items in the list? What is the size of getChildrenCount()? Also, I didn't understand exactly where are the check boxes. – Laura Sep 25 '17 at 18:12
  • Yes I only see the parent item in the list, I have uploaded an image so you can see, but please note that the check boxes are not part of the expandable list view, just xml check boxes after it. I havn't incorporated the check boxes yet. I wanted to let you know the overall project so you can assist me better, or maybe there is a different way all together that I can implement the idea. – Edon Freiner Sep 25 '17 at 18:46
  • Thanks for your help, the issue was that the view was way too small and everything was woking fine except that you couldn't see it. I also managed to get the check boxes in there however, I cant get the check box listener to work. why is that? Also, is there a way to resize the view when some thing is open and when it closes? Thanks – Edon Freiner Sep 25 '17 at 22:00

2 Answers2

0

I've realized that when the child of an ExpandableListView is focusable (like Button, Checkbox), you need to set (on your child element):

android:focusable="false"

This is because these child elements steal focus from your touch which is meant to expand the list view.

This was originally my answer to the question at Android ExpandableListView not expanding which seems to have helped a few people.

EDIT The focusable property indicates a widget can receive focus which is different from clicks (which buttons, checkboxes, etc. receive)

ucsunil
  • 7,378
  • 1
  • 27
  • 32
  • Thanks for your help @ucsunil, but that hasnt dont the trick. also, I think I would need to set it to true later on when I would want to put check boxes in there – Edon Freiner Sep 25 '17 at 18:47
  • Have you tried setting it on the TextView itself? I believe TextView is focusable (as in can get focus if you use a keyboard which is different from receiving clicks). – ucsunil Sep 25 '17 at 21:12
  • Thanks for your help, the issue was that the view was way too small and everything was woking fine except that you couldn't see it. I also managed to get the check boxes in there however, I cant get the check box listener to work. why is that? Also, is there a way to resize the view when some thing is open and when it closes? Thanks – Edon Freiner Sep 25 '17 at 22:01
  • Ah.. you may have to explicitly set the clickable property to true. It's one of those properties that you rarely need to use but I remember I had to play around with those to get them all working. – ucsunil Sep 25 '17 at 22:16
  • I am assuming this is for the child checkbox, correct? What exactly does set clickable do? right now it does click, I just cant set a listener to it. Also, I can detect if it is clicked, just the listener part doesnt work – Edon Freiner Sep 25 '17 at 23:21
0

I think that might be one of 2 issues: either the getChildrenCount method returns 0, either some view is getting focus. Try to use this code in the container layout for parent XML:

android:descendantFocusability="blocksDescendants"
Laura
  • 2,653
  • 7
  • 37
  • 59
  • Hey, I logged this: `getChildrenCount`and it returns 7. But thank you – Edon Freiner Sep 25 '17 at 19:09
  • Thanks for your help, the issue was that the view was way too small and everything was woking fine except that you couldn't see it. I also managed to get the check boxes in there however, I cant get the check box listener to work. why is that? Also, is there a way to resize the view when some thing is open and when it closes? Thanks – Edon Freiner Sep 25 '17 at 22:01