2012-02-14 1 views
12

각 그룹이 TextView이고 각 자식이 CheckBoxExpandableListView을 사용하고 있습니다. 나는이 링크 비슷한 구현하기 위해 노력했다 :ExpandableListView의 체크 박스

http://www.vogella.de/articles/AndroidListView/article.html#listadvanced_interactive

을 대신 ListViewExpandableListView와. 런타임시 이상한 ClassCastException을 표시하고 setTag()을 사용하여 확인란에 Tag을 설정합니다.

public class ExpandableActivity extends Activity { 

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

    ArrayList<String> groups = new ArrayList<String>(); 
    List<List<OptionItem>> children = new ArrayList<List<OptionItem>>(); 

    for (int i = 0; i < 10; i++) { 
     String groupName = "Group " + i; 
     groups.add(groupName); 
     List<OptionItem> temp = new ArrayList<OptionItem>(); 
     for (int j = 0; j < 5; j++) { 
      temp.add(new OptionItem(groupName, "Child " + j)); 
     } 
     children.add(temp); 
    } 

    children.get(0).get(3).setSelected(true); 
    children.get(5).get(2).setSelected(true); 
    children.get(8).get(1).setSelected(true); 
    children.get(3).get(4).setSelected(true); 

    ExpandableListView elv = (ExpandableListView) findViewById(R.id.expandableListView1); 
    elv.setAdapter(new ExpandableAdapter(groups, children)); 

} 

public static class ViewHolder { 
    protected CheckBox cb; 
} 

public class ExpandableAdapter extends BaseExpandableListAdapter { 

    private List<List<OptionItem>> list; 
    private ArrayList<String> groups; 

    public ExpandableAdapter(ArrayList<String> groups, 
      List<List<OptionItem>> children) { 
     this.groups = groups; 
     this.list = children; 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosition) { 
     if (list != null && list.size() > groupPosition 
       && list.get(groupPosition) != null) { 
      if (list.get(groupPosition).size() > childPosition) 
       return list.get(groupPosition).get(childPosition); 
     } 

     return null; 
    } 

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

    @Override 
    public View getChildView(final int groupPosition, 
      final int childPosition, boolean isLastChild, View convertView, 
      ViewGroup parent) { 

     View view = null; 
     if (convertView == null) { 
      view = getLayoutInflater().inflate(R.layout.row, null); 
      final ViewHolder childHolder = new ViewHolder(); 
      childHolder.cb = (CheckBox) view.findViewById(R.id.checkBox1);    
      childHolder.cb 
        .setOnCheckedChangeListener(new OnCheckedChangeListener() { 
         @Override 
         public void onCheckedChanged(CompoundButton button, 
           boolean isChecked) { 
          OptionItem item = (OptionItem) childHolder.cb 
            .getTag(); 
          item.setSelected(button.isChecked()); 
         } 
        }); 

      view.setTag(childHolder); 
      childHolder.cb.setTag(list.get(groupPosition).get(childPosition)); 
     } else { 
      view = convertView;   
      ((ViewHolder) view.getTag()).cb.setTag(list.get(groupPosition).get(childPosition)); 
     } 

     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.cb.setChecked(list.get(groupPosition).get(childPosition) 
       .isSelected()); 
     holder.cb.setText(list.get(groupPosition).get(childPosition) 
       .getChildName()); 

     return view; 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     if (list != null && list.size() > groupPosition 
       && list.get(groupPosition) != null) 
      return list.get(groupPosition).size(); 

     return 0; 
    } 

    @Override 
    public Object getGroup(int groupPosition) { 
     if (groups != null && groups.size() > groupPosition) 
      return groups.get(groupPosition); 

     return null; 
    } 

    @Override 
    public int getGroupCount() { 
     if (groups != null) 
      return groups.size(); 

     return 0; 
    } 

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

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
      View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = getLayoutInflater().inflate(
        android.R.layout.simple_expandable_list_item_1, null); 
     } 

     TextView tv = (TextView) convertView 
       .findViewById(android.R.id.text1); 
     tv.setText(groups.get(groupPosition)); 

     return convertView; 
    } 

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

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

및 데이터 모델 클래스 : 도와주세요

public class OptionItem { 

private String groupName; 
private String childName; 
private boolean selected; 

public OptionItem(String group, String child) { 

    this.groupName = group; 
    this.childName = child; 
    selected = false; 
} 

public void setGroupName(String name) { 
    this.groupName = name; 
} 

public void setChildName(String name) { 
    this.childName = name; 
} 

public void setSelected(boolean selected) { 
    this.selected = selected; 
} 

public String getGroupName() { 
    return groupName; 
} 

public String getChildName() { 
    return childName; 
} 

public boolean isSelected() { 
    return selected; 
} 

여기에 코드입니다. 미리 감사드립니다.

편집 : 로그는 다음과 같다 :

02-15 12:40:03.224: E/AndroidRuntime(423): FATAL EXCEPTION: main 
02-15 12:40:03.224: E/AndroidRuntime(423): java.lang.ClassCastException: com.test.OptionItem 
02-15 12:40:03.224: E/AndroidRuntime(423): at com.test.ExpandableActivity$ExpandableAdapter.getChildView(ExpandableActivity.java:106) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:450) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.AbsListView.obtainView(AbsListView.java:1315) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.ListView.makeAndAddView(ListView.java:1727) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.ListView.fillDown(ListView.java:652) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.ListView.fillSpecific(ListView.java:1284) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.ListView.layoutChildren(ListView.java:1558) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.AbsListView.onLayout(AbsListView.java:1147) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.View.layout(View.java:7035) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.View.layout(View.java:7035) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.View.layout(View.java:7035) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.LinearLayout.onLayout(LinearLayout.java:1042) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.View.layout(View.java:7035) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.widget.FrameLayout.onLayout(FrameLayout.java:333) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.View.layout(View.java:7035) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.ViewRoot.performTraversals(ViewRoot.java:1045) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.os.Looper.loop(Looper.java:123) 
02-15 12:40:03.224: E/AndroidRuntime(423): at android.app.ActivityThread.main(ActivityThread.java:4627) 
02-15 12:40:03.224: E/AndroidRuntime(423): at java.lang.reflect.Method.invokeNative(Native Method) 
02-15 12:40:03.224: E/AndroidRuntime(423): at java.lang.reflect.Method.invoke(Method.java:521) 
02-15 12:40:03.224: E/AndroidRuntime(423): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
02-15 12:40:03.224: E/AndroidRuntime(423): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
02-15 12:40:03.224: E/AndroidRuntime(423): at dalvik.system.NativeStart.main(Native Method) 

편집 : 나는 여전히 같은 예외를주고, 다시 노력했다.

import java.util.ArrayList; 
import java.util.List; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseExpandableListAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.ExpandableListView; 
import android.widget.TextView; 
+0

Log를 질문에 추가하십시오. – Natali

+0

@Natali - 로그를 추가했습니다. –

답변

2

Natali에게 감사드립니다. 문제를 파악했습니다. 레이아웃 파일 "row.xml"에 문제가 있습니다. 나는 다음을 사용했다 :

<?xml version="1.0" encoding="utf-8"?> 
<CheckBox xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/checkBox1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="CheckBox" /> 

레이아웃. 그러나 내가 그것을 바꿨을 때 :

<?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="fill_parent" 
    android:orientation="vertical" > 

    <CheckBox 
     android:id="@+id/checkBox1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="CheckBox" /> 

</LinearLayout> 

그것은 매력과 같았다. 나는 이것이 버그라고 생각한다. 나탈리가이 문제를 해결해 주셔서 감사합니다.

3

내가 코드를 시도하고 아무런 문제가없는 : 여기에 추가 한 수입은 enter image description here

당신의 수입을 추가하십시오, 어쩌면 약간의 문제가있는가.

+0

다시 시도했지만 동일한 예외가 여전히 발생합니다. 가져 오기를 확인하십시오. 나는 그것들을 질문에 추가했다. –

+0

그들은 옳다. – Natali

+0

은 같은 패키지에있는 귀하의 광고입니까? – Natali