Tyler Story
Tyler Story

Reputation: 15

onChildClick Event for ExpandableListAdapter not working

I've been looking at other people's answers on this question, but so far nothing seems to be working.

Currently I have an ExpandableListAdapter built from one of the examples that came with the SDK. As far as displaying data I got it to work fine for, but I can't get the onChildClick event to work at all. I've tried setting the focusable attribute on my XML elements to false, but I'm still not having any luck.

Currently this is what I have for code:

MainActivity.java

package com.example.expandablelisttest;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ExpandableListView;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ExpandableListView expandableListView = (ExpandableListView) findViewById(R.id.expandableListView1);

    ExpandableListAdapter expandableAdapter = new ExpandableListAdapter();

    expandableListView.setAdapter(expandableAdapter);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
}

ExpandableListAdapter.java

package com.example.expandablelisttest;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;

public class ExpandableListAdapter extends BaseExpandableListAdapter
implements ExpandableListView.OnChildClickListener
{       
private String[] groups = { "People Names", "Dog Names", "Cat Names", "Fish Names" };
private String[][] children = {
        { "Arnold", "Barry", "Chuck", "David" },
        { "Ace", "Bandit", "Cha-Cha", "Deuce" },
        { "Fluffy", "Snuggles" },
        { "Goldy", "Bubbles" }
};



public Object getChild(int groupPosition, int childPosition) {
    return children[groupPosition][childPosition];
}

public long getChildId(int groupPosition, int childPosition) {
    return childPosition;
}

@Override
public View getChildView(int groupPosition, int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent)
{
    if (convertView ==null)
    {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());           
        convertView = layoutInflater.inflate(R.layout.child_view,  null);
    }

    TextView childTxt = (TextView) convertView.findViewById(R.id.childTxt);
    childTxt.setText(getChild(groupPosition, childPosition).toString());

    return convertView;
}

@Override
public int getChildrenCount(int groupPosition) {
    return children[groupPosition].length;
}

@Override
 public Object getGroup(int groupPosition) {
     return groups[groupPosition];
 }

 @Override
 public int getGroupCount() {
     return groups.length;
 }

 @Override
 public long getGroupId(int groupPosition) {
     return groupPosition;
 }

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent)
{
    if (convertView ==null)
    {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());   
        convertView = layoutInflater.inflate(R.layout.group_view,  null);
    }

    TextView groupTxt = (TextView) convertView.findViewById(R.id.groupTxt);
    groupTxt.setText(getGroup(groupPosition).toString());

    return convertView;
}

@Override
public boolean hasStableIds() {
    // TODO Auto-generated method stub
    return true;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    // TODO Auto-generated method stub
    return true;
}

@Override
public boolean onChildClick(ExpandableListView parent, View v,
    int groupPosition, int childPosition, long id)
{
    Log.d("Result:", "Click event triggered");
    return true;
}   
}

activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <ExpandableListView
        android:id="@+id/expandableListView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1" >
    </ExpandableListView>

</LinearLayout>

child_view.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="match_parent"
android:orientation="vertical"
android:focusable="false" >

<TextView
    android:id="@+id/childTxt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Medium Text"
    android:textAppearance="?android:attr/textAppearanceMedium"
    android:focusable="false"/>

</LinearLayout>

group_view.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="match_parent"
android:orientation="vertical"
android:focusable="false" >

<TextView
    android:id="@+id/groupTxt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="36dp"
    android:text="Large Text"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:focusable="false" />

</LinearLayout>

If anyone can see why my click event isn't firing and can help me out. I'd greatly appreciate it. Thanks in advance.

Upvotes: 0

Views: 3575

Answers (3)

user5615786
user5615786

Reputation:

change boolean return value true if you are using isChildSelectable return value false in adapter.You can use this

@Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

instead of

@Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return false;
        }

Upvotes: 0

user3928711
user3928711

Reputation: 89

This is happening mainly because your child is not getting selected when your trying to click on it because in the adapter which contains method for doing this is called isChildSelectable() which returns flase by default , so make it true as u want it to get selected and the problem is resolved... thanks :)

Upvotes: 8

Darwind
Darwind

Reputation: 7371

The OnChildClickListener doesn't belong in the Adapter it should be added to the ExpandableListView instead inside your Activity.

Like this:

expandableListView.setOnChildClickListener(new OnChildClickListener() {
    @Override
    public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
        // Handle clicks on the children here...
        return false;
    }
});

Upvotes: 2

Related Questions