带有组和子复选框的可扩展列表视图给出空指针异常

Posted

技术标签:

【中文标题】带有组和子复选框的可扩展列表视图给出空指针异常【英文标题】:Expandable listview with group and child checkbox giving null pointer exception 【发布时间】:2014-11-09 20:28:17 【问题描述】:
I have an expandable listview with checkboxes in group and child. 

我想要的是当我选中组复选框时,它的所有子项都应该被选中。 但是当我运行程序时,我得到了空指针异常。这是我的代码......谢谢

//ExpandableListAdapter.java:

import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
import android.view.View.OnClickListener;


public class ExpandableListAdapter extends BaseExpandableListAdapter 

    LayoutInflater inflater;

    /*list of group */
    private ArrayList<Group> groups;
    private ArrayList<Boolean> isCheckedHeader=new ArrayList<Boolean>();
    private HashMap<String, ArrayList<Boolean>> IsCheckedChild;


public ExpandableListAdapter(Context context,ArrayList<Group> groups,ArrayList<Boolean> isCheckedHeader,HashMap<String, ArrayList<Boolean>> IsCheckedChild) 
    super();
        this.groups=groups;
        this.isCheckedHeader=isCheckedHeader;
        this.IsCheckedChild=IsCheckedChild;
        inflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
    /**
     * @param child
     * @param group
     *  use for adding item to list view
     */
    public void addItem(Child child,Group group) 
        if(!groups.contains(group)) 
            groups.add(group);
        
        int index=groups.indexOf(group);
        ArrayList<Child> ch=groups.get(index).getChildrens();
        ch.add(child);
        groups.get(index).setChildrens(ch);
    

    public Child getChild(int groupPosition, int childPosition) 
        ArrayList<Child> ch=groups.get(groupPosition).getChildrens();

        return ch.get(childPosition);
    

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

    @Override
    public int getChildrenCount(int groupPosition) 
        ArrayList<Child> ch=groups.get(groupPosition).getChildrens();
        return ch.size();
    

    public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
            View convertView, ViewGroup parent) 
        Child child= (Child) getChild(groupPosition,childPosition);
        TextView childName=null;
        if(convertView==null) 
          convertView=inflater.inflate(R.layout.child_view, null);
        

        final CheckBox chkChild=(CheckBox)convertView.findViewById(R.id.checkBoxC);
        childName=(TextView) convertView.findViewById(R.id.textViewChildName);
        childName.setText(child.getChildName());
        chkChild.setChecked(IsCheckedChild.get(this.groups.get(groupPosition)).get(childPosition));

        final int iGroupPos = groupPosition;
        final int iChildPos = childPosition;

        chkChild.setOnClickListener(new View.OnClickListener() 

            @Override
            public void onClick(View v) 
                // TODO Auto-generated method stub
                if(chkChild.isChecked()) //the child was enable (checked)
                
                    IsCheckedChild.get(groups.get(iGroupPos)).set(iChildPos, true);
                
                else //the child was disable (non-checked)
                
                    IsCheckedChild.get(groups.get(iGroupPos)).set(iChildPos, false);
                
            
        );

        return convertView;
    
    public Group getGroup(int groupPosition) 
        return groups.get(groupPosition);
    

    public int getGroupCount() 
        return groups.size();
    

    public long getGroupId(int groupPosition) 
        return groupPosition;
    

    public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
            ViewGroup parent) 
        TextView groupName = null;
        Group group=(Group) getGroup(groupPosition);
        if(convertView==null) 
          convertView=inflater.inflate(R.layout.group_view, null);         
           

        groupName=(TextView) convertView.findViewById(R.id.textViewGroupName);
        groupName.setText(group.getGroupName());
        final CheckBox chkParent=(CheckBox)convertView.findViewById(R.id.checkBoxH);
        chkParent.setChecked(isCheckedHeader.get(groupPosition));
        final int iPos = groupPosition;
        chkParent.setOnClickListener(new OnClickListener() 

            @Override
            public void onClick(View v) 
                // TODO Auto-generated method stub
                if(chkParent.isChecked()) 
                    isCheckedHeader.set(iPos, true);
                    //Checking all SubItem(Childs) of this
                    int iSizeChilds = getChildrenCount(iPos);
                    for(int i=0;i<iSizeChilds;i++) 
                        IsCheckedChild.get(groups.get(iPos)).set(i, true);
                    
                
                notifyDataSetChanged();
            
        );
        return convertView;
    

    public boolean isChildSelectable(int groupPosition, int childPosition) 
        return true;
    

    public boolean hasStableIds() 
        return true;
    

//Group.java:

import java.util.ArrayList;

public class Group 
    public String groupId;
    public String groupName;
    public ArrayList<Child> childrens;
    public Group(String groupId, String groupName,
            ArrayList<Child> childrens) 
        super();
        this.groupId = groupId;
        this.groupName = groupName;
        this.childrens = childrens;
    
    public String getGroupId() 
        return groupId;
    
    public void setGroupId(String groupId) 
        this.groupId = groupId;
    
    public String getGroupName() 
        return groupName;
    
    public void setGroupName(String groupName) 
        this.groupName = groupName;
    
    public ArrayList<Child> getChildrens() 
        return childrens;
    
    public void setChildrens(ArrayList<Child> childrens) 
        this.childrens = childrens;
    



//Child.java:

public class Child 
    public String chiledId;
    public String childName;
    public Child(String chiledId, String childName) 
        super();
        this.chiledId = chiledId;
        this.childName = childName;
    
    public String getChiledId() 
        return chiledId;
    
    public void setChiledId(String chiledId) 
        this.chiledId = chiledId;
    
    public String getChildName() 
        return childName;
    
    public void setChildName(String childName) 
        this.childName = childName;
    

//在MainActivity中项目是动态添加的。

    MainActivity.java:

   public class MainActivity extends Activity 
    /*our expandable adapter */
    ExpandableListAdapter expandableListAdapter;
    /*expandable list*/
    ExpandableListView expandableListView;
    /*list items*/
    ArrayList<Group> groups=new ArrayList<Group>();
    ArrayList<Boolean> isCheckedHeader;
    HashMap<String, ArrayList<Boolean>> IsCheckedChild;
        @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        isCheckedHeader=new ArrayList<Boolean>();
        IsCheckedChild=new HashMap<String, ArrayList<Boolean>>();
        /*genarate data for list view*/
        genarateData();
        /*instantiate adapter with our item list*/
        expandableListAdapter=new ExpandableListAdapter(this, groups,isCheckedHeader,IsCheckedChild);
        /*we get list view*/
        expandableListView=(ExpandableListView) findViewById(R.id.expandableListView);
        /*set adapter to list view*/
        expandableListView.setAdapter(expandableListAdapter);
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    
    //Generate dummy data for list view
    public void genarateData() 
        Group group;

        for (int i = 0; i < 10; i++) 

            ArrayList<Child> childrens=new ArrayList<Child>();
            childrens.clear();
            Child child;

            for (int j = 0; j < 5; j++) 
                child=new Child(""+j, "Child "+j);
                childrens.add(child);   
            
            group=new Group(""+i, " Group "+i, childrens);
            groups.add(group);
            isCheckedHeader.add(false);
        
    

这是我的日志。

09-16 03:24:19.341: I/Process(1863): Sending signal. PID: 1863 SIG: 9
09-16 03:24:27.871: D/dalvikvm(1903): GC_FOR_ALLOC freed 59K, 5% free 2949K/3092K, paused 31ms, total 32ms
09-16 03:24:27.871: I/dalvikvm-heap(1903): Grow heap (frag case) to 3.562MB for 635812-byte allocation
09-16 03:24:27.921: D/dalvikvm(1903): GC_FOR_ALLOC freed 2K, 4% free 3567K/3716K, paused 40ms, total 40ms
09-16 03:24:28.441: D/AndroidRuntime(1903): Shutting down VM
09-16 03:24:28.441: W/dalvikvm(1903): threadid=1: thread exiting with uncaught exception (group=0xb3a12ba8)
09-16 03:24:28.451: E/AndroidRuntime(1903): FATAL EXCEPTION: main
09-16 03:24:28.451: E/AndroidRuntime(1903): Process: com.android.guide.expandablelistview, PID: 1903
09-16 03:24:28.451: E/AndroidRuntime(1903): java.lang.NullPointerException
09-16 03:24:28.451: E/AndroidRuntime(1903):     at com.android.guide.expandablelistview.ExpandableListAdapter.getGroupView(ExpandableListAdapter.java:117)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:446)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.AbsListView.obtainView(AbsListView.java:2263)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.ListView.makeAndAddView(ListView.java:1790)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.ListView.fillDown(ListView.java:691)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.ListView.fillFromTop(ListView.java:752)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.ListView.layoutChildren(ListView.java:1630)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.AbsListView.onLayout(AbsListView.java:2091)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.View.layout(View.java:14817)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.View.layout(View.java:14817)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.View.layout(View.java:14817)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:374)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.View.layout(View.java:14817)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.View.layout(View.java:14817)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.ViewGroup.layout(ViewGroup.java:4631)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.Choreographer.doCallbacks(Choreographer.java:574)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.Choreographer.doFrame(Choreographer.java:544)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.os.Handler.handleCallback(Handler.java:733)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.os.Handler.dispatchMessage(Handler.java:95)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.os.Looper.loop(Looper.java:136)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at android.app.ActivityThread.main(ActivityThread.java:5017)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at java.lang.reflect.Method.invokeNative(Native Method)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at java.lang.reflect.Method.invoke(Method.java:515)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
09-16 03:24:28.451: E/AndroidRuntime(1903):     at dalvik.system.NativeStart.main(Native Method)
09-16 03:25:11.961: I/Process(1903): Sending signal. PID: 1903 SIG: 9


How can I correct this?
PS:I'm a beginner. Thanks :)

【问题讨论】:

发布你的日志垃圾。你会在哪个地方得到异常。? 我在运行程序时立即得到错误。 发布日志,它包含的信息比您想象的要多。如果这是您的完整代码,我可以猜到 isCheckedHeaderIsCheckedChild 不会启动 @BLackBeard 我已经添加了 logcat。 在 ExpandableListAdapter.java:117 显示行 【参考方案1】:

试试这个代码,

使用final Parent parent = parents.get(groupPosition); 而不是使用

Group group=(Group) getGroup(groupPosition);

然后更改复选框 setcheck-

CheckBox checkbox = (CheckBox) convertView.findViewById(R.id.checkbox);
checkbox.setChecked(parent.isChecked());

看这个链接:link

【讨论】:

不工作。Group 是父 bean 类的名称。如何给 Parent 而不是 Group? 我发现arraylist isCheckHeader 为空。这就是为什么它显示空指针异常。但我不知道在哪里添加到该数组列表。 在genarateData()中添加你的布尔数组列表;在主要活动中 我给了 isCheckedHeader.add(false);在 generateData();但它现在显示 IndexOutofBoundsException。 :( 我在 Group group 声明下面给出了它。 我正在编辑这个程序mobiledevguide.com/2012/09/how-to-work-with-android.html【参考方案2】:

我认为您没有正确初始化所有对象。一些对象是有价值的。请检查你 正确初始化对象。

【讨论】:

以上是关于带有组和子复选框的可扩展列表视图给出空指针异常的主要内容,如果未能解决你的问题,请参考以下文章

片段中的 Listview 适配器给出空指针异常

带有空指针的 2D 指针数组 c++

捕获空指针异常是代码异味吗?

列表视图中的空指针异常?

SOLRJ-6.0.0:插入关联 bean 对象列表的 bean 对象给出空指针异常

如何在颤动中的扩展磁贴内添加带有动态选择复选框的列表视图