How to get an item from child in ExpandableListView?
Asked Answered
M

3

9

I have onChildClick method on my application, this my code

public class listview extends ExpandableListActivity {

 private static final String NAME = "NAME";
 private static final String IS_EVEN = "IS_EVEN";
 private ExpandableListAdapter mAdapter;
 List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();
 List<List<Map<String, String>>> childData = new ArrayList<List<Map<String, String>>>();
 InputStream is;
 boolean addState = true;
 boolean addCountry;
 HashMap<String, String> countryMap = new HashMap<String, String>();
 HashMap<String, String> stateMap = new HashMap<String, String>();
 int count = 0;
 int count1 = -1;
 int count2 = 0;
 List<String> stateCount = new ArrayList<String>();

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  // Reading data from text file to inout stream
  is = this.getResources().openRawResource(R.raw.countrystate);
  BufferedReader reader = new BufferedReader(new InputStreamReader(is));
  try {
   String line = "";
   while ((line = reader.readLine()) != null) {
    String[] strings = line.split("-");
    String ctry = strings[0].trim();
    String st = strings[1].trim();
    /*
     * loading country and state to two separate hash tables
     */
    if (countryMap.containsValue(ctry)) {
     addCountry = false;
     if (!addState) {
      stateMap.put("state" + count1 + count2, st);
      count2++;
     }
    } else {
     addCountry = !addCountry;
     count1++;
     //adding no. of states for a country to a list
     stateCount.add("" + count2);
     if (addCountry) {
      count2 = 0;
      countryMap.put("country" + count, ctry);
      stateMap.put("state" + count1 + count2, st);
      addState = false;
     }
     count2++;
     count++;
    }
   }
  } catch (Exception e) {
  }
  //re-arranging the state count list
  stateCount.add("" + count2);
  stateCount.remove(0);
  for (int i = 0; i < countryMap.size(); i++) {
   Map<String, String> curGroupMap = new HashMap<String, String>();
   groupData.add(curGroupMap);
   String ctry = countryMap.get("country" + i);
   curGroupMap.put(NAME, ctry);
   curGroupMap.put(IS_EVEN, "Country " + i);
   List<Map<String, String>> children = new ArrayList<Map<String, String>>();
   int k = Integer.parseInt(stateCount.get(i));
   for (int j = 0; j < k; j++) {
    Map<String, String> curChildMap = new HashMap<String, String>();
    children.add(curChildMap);
    curChildMap.put(NAME, stateMap.get("state" + i + j));
   // curChildMap.put(IS_EVEN, "State " + j);
   }
   childData.add(children);
  }



  // Set up our adapter
  mAdapter = new SimpleExpandableListAdapter(this, groupData,
    android.R.layout.simple_expandable_list_item_1, new String[] {
      NAME, IS_EVEN }, new int[] { android.R.id.text1,
      android.R.id.text2 }, childData,
    android.R.layout.simple_expandable_list_item_2, new String[] {
      NAME, IS_EVEN }, new int[] { android.R.id.text1,
      android.R.id.text2 });
  setListAdapter(mAdapter);


    }
  public boolean onChildClick (ExpandableListView parent, View v, int groupPosition,int childPosition,long id) {
        System.out.println("Inside onChildClick at groupPosition = " + groupPosition +" Child clicked at position " + childPosition+v.toString());

        return true;

 }

  public List<List<Map<String, String>>> getChildData() {
    return childData;
}

}

my onClick method

public boolean onChildClick (ExpandableListView parent, View v, int groupPosition,int childPosition,long id) {
        System.out.println("Inside onChildClick at groupPosition = " + groupPosition +" Child clicked at position " + childPosition+v.toString());

        return true;

 }

i want to get String if i clicked list child

This my logcat:

07-18 11:40:54.334: INFO/System.out(1014): Inside onChildClick at groupPosition = 0 Child clicked at position 0android.widget.TwoLineListItem@405337c0
07-18 11:40:56.714: DEBUG/dalvikvm(916): GC_EXPLICIT freed 14K, 53% free 2557K/5379K, external 884K/1038K, paused 111ms
07-18 11:40:58.744: INFO/System.out(1014): Inside onChildClick at groupPosition = 0 Child clicked at position 0android.widget.TwoLineListItem@405337c0

I want to get String data not "TwoLineListItem@405337c0", anyone can help me? thanks

Maltreat answered 18/7, 2012 at 4:44 Comment(1)
Show short and erroneous piece of your code.Rothstein
H
18

Use:

parent.getExpandableListAdapter().getChild(groupPosition, childPosition);

(if you want the data of a child, or .getGroup(groupPosition) if you want the data from the group) view instead of:

v.toString()
Hawger answered 18/7, 2012 at 4:59 Comment(2)
thanks @Luksprog, but the result is {NAME=Colombo} , i want to get String "Colombo", can you help me?Maltreat
You saved my day. I cast that to a Cursor and now I'm happy (I backed the ExpandableListView with a CursorAdapter)Interrupted
T
4

try this

public boolean onChildClick (ExpandableListView parent, View v, int groupPosition,int childPosition,long id) {
        System.out.println("Inside onChildClick at groupPosition = " + groupPosition +" Child clicked at position " +  childData.get(groupposition).get(childPosition).get("NAME"));

        return true;

 }
Twylatwyman answered 18/7, 2012 at 5:12 Comment(0)
S
2

For some reason the above answers didnt work for me but i found a solution here below

@Override
    public boolean onChildClick(ExpandableListView parent, View v,
            int groupPosition, int childPosition, long id) {
        // TODO Auto-generated method stub

        String message;
        TextView tx = (TextView) v; 
        message=tx.getText().toString();
        return false;
    }

Through this code you will get the text of the ExpandableListView child clicked

Spasm answered 10/8, 2014 at 15:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.