2013-04-25 112 views
2

我已經創建了一個可展開的列表視圖,但是無法附加onclick監聽器的子列表項。Onclick listner to expandable listview

活動代碼:

public class MyActivity extends Activity { 

     private ExpandableListView mExpandableList; 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 


      mExpandableList = (ExpandableListView)findViewById(R.id.expandable_list); 

      ArrayList<Parent> arrayParents = new ArrayList<Parent>(); 
      ArrayList<String> arrayChildren = new ArrayList<String>(); 

      //here we set the parents and the children 
      for (int i = 0; i < 2; i++){ 
       //for each "i" create a new Parent object to set the title and the children 
       Parent parent = new Parent(); 
       parent.setTitle("Parent " + i); 

       arrayChildren = new ArrayList<String>(); 
       for (int j = 0; j < 3; j++) { 
        arrayChildren.add("Child " + j); 
       } 
       parent.setArrayChildren(arrayChildren); 

       //in this array we add the Parent object. We will use the arrayParents at the setAdapter 
       arrayParents.add(parent); 
      } 

      //sets the adapter that provides data to the list. 
      mExpandableList.setAdapter(new MyCustomAdapter(MyActivity.this,arrayParents)); 

     } 

    } 

的列表的自定義適配器:

public class MyCustomAdapter extends BaseExpandableListAdapter { 


    private LayoutInflater inflater; 
    private ArrayList<Parent> mParent; 

    public MyCustomAdapter(Context context, ArrayList<Parent> parent){ 
     mParent = parent; 
     inflater = LayoutInflater.from(context); 
    } 


    @Override 
    //counts the number of group/parent items so the list knows how many times calls getGroupView() method 
    public int getGroupCount() { 
     return mParent.size(); 
    } 

    @Override 
    //counts the number of children items so the list knows how many times calls getChildView() method 
    public int getChildrenCount(int i) { 
     return mParent.get(i).getArrayChildren().size(); 
    } 

    @Override 
    //gets the title of each parent/group 
    public Object getGroup(int i) { 
     return mParent.get(i).getTitle(); 
    } 

    @Override 
    //gets the name of each item 
    public Object getChild(int i, int i1) { 
     return mParent.get(i).getArrayChildren().get(i1); 
    } 

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

    @Override 
    public long getChildId(int i, int i1) { 
     return i1; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    @Override 
    //in this method you must set the text to see the parent/group on the list 
    public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) { 

     if (view == null) { 
      view = inflater.inflate(R.layout.list_item_parent, viewGroup,false); 
     } 

     TextView textView = (TextView) view.findViewById(R.id.list_item_text_view); 
     //"i" is the position of the parent/group in the list 
     textView.setText(getGroup(i).toString()); 

     //return the entire view 
     return view; 
    } 

    @Override 
    //in this method you must set the text to see the children on the list 
    public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) { 
     if (view == null) { 
      view = inflater.inflate(R.layout.list_item_child, viewGroup,false); 
     } 

     TextView textView = (TextView) view.findViewById(R.id.list_item_text_child); 
     //"i" is the position of the parent/group in the list and 
     //"i1" is the position of the child 
     textView.setText(mParent.get(i).getArrayChildren().get(i1)); 

     //return the entire view 
     return view; 
    } 

    @Override 
    public boolean isChildSelectable(int i, int i1) { 
     return true; 
    } 

    @Override 
    public void registerDataSetObserver(DataSetObserver observer) { 
     /* used to make the notifyDataSetChanged() method work */ 
     super.registerDataSetObserver(observer); 
    } 
} 

父類

public class Parent { 
    private String mTitle; 
    private ArrayList<String> mArrayChildren; 

    public String getTitle() { 
     return mTitle; 
    } 

    public void setTitle(String mTitle) { 
     this.mTitle = mTitle; 
    } 

    public ArrayList<String> getArrayChildren() { 
     return mArrayChildren; 
    } 

    public void setArrayChildren(ArrayList<String> mArrayChildren) { 
     this.mArrayChildren = mArrayChildren; 
    } 

} 

我應該怎麼做才能將onclick監聽器添加到子列表項中?

回答

10

Add this after you setAdapter of the Expandable list

mExpandableList.setOnChildClickListener(new OnChildClickListener() { 

    @Override 
    public boolean onChildClick(ExpandableListView parent, View v,int groupPosition, int childPosition, long id) { 

     /* You must make use of the View v, find the view by id and extract the text as below*/ 

     TextView tv= (TextView) v.findViewById(R.id.childTextView); 

     String data= tv.getText().toString();     

     return true; // i missed this 
    } 
}); 
+0

如何獲取單元格的內容? – kittu88 2013-04-25 12:07:51

+0

獲取此錯誤:此方法必須在onChildClick方法中返回布爾類型的結果 – kittu88 2013-04-25 12:09:35

+0

檢查更新後的答案。 – SKK 2013-04-25 12:11:32

2

您需要添加

ChildClickListener

這樣的:mExpandableList.setOnChildClickListener 此行添加到onCreate方法 read here

也這是a good example

+0

在哪裏添加此代碼? – kittu88 2013-04-25 11:58:44

+0

我將如何獲得該特定單元格列表中的內容? – kittu88 2013-04-25 12:01:59

+0

已更新我的回答 – 2013-04-25 12:02:52

0

聲明您的listView與覆蓋onChildClick

ExpandableListView listView = getExpandableListView(); 
listView.setChoiceMode(ExpandableListView.CHOICE_MODE_SINGLE); 
listView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 
     @Override 
     public boolean onChildClick(ExpandableListView parent, View v,int groupPosition, int childPosition,long id) { 
      Log.d(TAG,"I got clicked childPosition:["+childPosition+"] groupPosition:["+groupPosition+"] id:["+id+"]"); 
      return true; 
     } 
});