2012-02-14 14 views
12

में चेकबॉक्स मैं ExpandableListView का उपयोग कर रहा हूं जिसमें प्रत्येक समूह TextView है और प्रत्येक बच्चा CheckBox है। मैं इस लिंक के लिए कुछ इसी तरह लागू करने के लिए कोशिश कर रहा था:ExpandableListView

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

लेकिन ListView के बजाय एक ExpandableListView साथ। रनटाइम पर, यह setTag() का उपयोग कर चेकबॉक्स के लिए Tag सेट करते समय एक अजीब ClassCastException दे रहा है।

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

कृपया प्रश्न पर अपना लॉग जोड़ें। – Natali

+0

@ नेटली - मैंने लॉग जोड़ा है। –

उत्तर

2

नतालि के लिए धन्यवाद, मैंने समस्या का पता लगाया है। समस्या लेआउट फ़ाइल "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

संबंधित मुद्दे