尝试在空对象引用上调用接口方法'int java.util.List.size()'

时间:2015-09-21 18:10:12

标签: java android

当我点击打开我的乘法难度expandableList给出了这个错误

09-21 12:31:21.827  18918-18918/com.spizer.mizer2 E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.spizer.mizer2, PID: 18918
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
        at com.spizer.mizer2.ExpandableListAdapter.getChildrenCount(ExpandableListAdapter.java:62)
        at android.widget.ExpandableListConnector.refreshExpGroupMetadataList(ExpandableListConnector.java:563)
        at android.widget.ExpandableListConnector.expandGroup(ExpandableListConnector.java:688)
        at android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:696)
        at android.widget.ExpandableListView.performItemClick(ExpandableListView.java:656)
        at android.widget.AbsListView$PerformClick.run(AbsListView.java:3667)
        at android.widget.AbsListView$3.run(AbsListView.java:5590)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:5972)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

在第62行,我不知道为什么但它没有为添加难度expandableList做这个,这里也是ExpandableListAdapter的类代码

    package com.spizer.mizer2;

    import java.util.HashMap;
    import java.util.List;

    import android.content.Context;
    import android.graphics.Typeface;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseExpandableListAdapter;
    import android.widget.TextView;

public class ExpandableListAdapter extends BaseExpandableListAdapter {

private Context _context;
private List<String> _listDataHeader; // header titles
// child data in format of header title, child title
private HashMap<String, List<String>> _listDataChild;

public ExpandableListAdapter(Context context, List<String> listDataHeader,
                             HashMap<String, List<String>> listChildData) {
    this._context = context;
    this._listDataHeader = listDataHeader;
    this._listDataChild = listChildData;
}

@Override
public Object getChild(int groupPosition, int childPosititon) {
    return this._listDataChild.get(this._listDataHeader.get(groupPosition))
            .get(childPosititon);
}

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

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

    final String childText = (String) getChild(groupPosition, childPosition);

    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_item, null);
    }

    TextView txtListChild = (TextView) convertView
            .findViewById(R.id.lblListItem);

    txtListChild.setText(childText);
    return convertView;
}

@Override
public int getChildrenCount(int groupPosition) {
    return this._listDataChild.get(this._listDataHeader.get(groupPosition))
            .size();
}

@Override
public Object getGroup(int groupPosition) {
    return this._listDataHeader.get(groupPosition);
}

@Override
public int getGroupCount() {
    return this._listDataHeader.size();
}

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

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
                         View convertView, ViewGroup parent) {
    String headerTitle = (String) getGroup(groupPosition);
    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_group, null);
    }

    TextView lblListHeader = (TextView) convertView
            .findViewById(R.id.lblListHeader);
    lblListHeader.setTypeface(null, Typeface.BOLD);
    lblListHeader.setText(headerTitle);

    return convertView;
}

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

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

这里有其他类与此todo: DifficultyMenu.java

package com.spizer.mizer2;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ExpandableListView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.view.View;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.Toast;

public class DifficultyMenu extends AppCompatActivity {

/** calls to make the class ProblemSelector usable in this class **/
final ProblemSelector PS = new ProblemSelector();

private int T1;
private int T2;
private int T3;
private int T4;

ExpandableListAdapter listAdapter;
ExpandableListView expListView;
List<String> listDataHeader;
HashMap<String, List<String>> listDataChild;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_difficulty_menu);

    // here you'll retrieve the data sent...you can google how to do that.

    // get the list view
    expListView = (ExpandableListView) findViewById(R.id.lvExp);

    // preparing list data
    prepareListData();

    listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild);

    // setting list adapter
    expListView.setAdapter(listAdapter);

    // List view Group click listener
    expListView.setOnGroupClickListener(new OnGroupClickListener() {
        @Override
        public boolean onGroupClick(ExpandableListView parent, View v,
                                    int groupPosition, long id) {
            // Toast.makeText(getApplicationContext(),
            // "Group Clicked " + listDataHeader.get(groupPosition),
            // Toast.LENGTH_SHORT).show();
            return false;
        }
    });

    // List view Group expanded listener
    expListView.setOnGroupExpandListener(new OnGroupExpandListener() {
        @Override
        public void onGroupExpand(int groupPosition) {
            Toast.makeText(getApplicationContext(),
                    listDataHeader.get(groupPosition) + " Expanded",
                    Toast.LENGTH_SHORT).show();
        }
    });

    // List view Group collapsed listener
    expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() {
        @Override
        public void onGroupCollapse(int groupPosition) {
            Toast.makeText(getApplicationContext(),
                    listDataHeader.get(groupPosition) + " Collapsed",
                    Toast.LENGTH_SHORT).show();

        }
    });

    // List view on child click listener
    expListView.setOnChildClickListener(new OnChildClickListener() {
        @Override
        public boolean onChildClick(ExpandableListView parent, View v,
                                    int groupPosition, int childPosition, long id) {
            Toast.makeText(
                    getApplicationContext(),
                    listDataHeader.get(groupPosition)
                            + " : "
                            + listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition), Toast.LENGTH_SHORT)
                    .show();
            /** converts the selected number in the expandable list to a usable integer variable **/
            if(listDataHeader.get(groupPosition).equals("AdditionDifficulty")) {
                String St1 = listDataHeader.get(childPosition);
                int AddDiff = Integer.parseInt(St1);
            }
            else if(listDataHeader.get(groupPosition).equals("SubtractionDifficulty")) {
                String St2 = listDataHeader.get(childPosition);
                int SubDiff = Integer.parseInt(St2);
            }
            else if(listDataHeader.get(groupPosition).equals("MultiplicationDifficulty")) {
                String St3 = listDataHeader.get(childPosition);
                int MultiDIff = Integer.parseInt(St3);
            }
            else if(listDataHeader.get(groupPosition).equals("DivisionDifficulty")) {
                String St4 = listDataHeader.get(childPosition);
                int DivisDiff = Integer.parseInt(St4);
            }
//                else {
//                    /** public static int e("DifficultyMenu.class", "could     not parse a group position when user selected a field"); **/
//                }
            return false;
        }
    });
}

/*
 * Preparing the list data
 */
private void prepareListData() {
    listDataHeader = new ArrayList<>();
    listDataChild = new HashMap<>();

    // Adding child data
    if(PS.AddProb) { listDataHeader.add("AdditionDifficulty"); }
    if(PS.SubProb) { listDataHeader.add("SubtractionDifficulty"); }
    if(PS.MultiProb) { listDataHeader.add("MultiplicationDifficulty"); }
    if(PS.DivisProb) { listDataHeader.add("DivisionDifficulty"); }
//        listDataHeader.add("AdditionDifficulty");
//        listDataHeader.add("SubtractionDifficulty");
//        listDataHeader.add("MultiplicationDifficulty");
//        listDataHeader.add("DivisionDifficulty");
    System.out.println(listDataHeader);
    /** this removes fields that the user has not selected to practice **/
//        if(!PS.AddProb) { listDataHeader.remove("AdditionDifficulty"); }
//        if(!PS.SubProb) { listDataHeader.remove("SubtractionDifficulty"); }
//        if(!PS.MultiProb) { listDataHeader.remove("MultiplicationDifficulty"); }
//        if(!PS.DivisProb) { listDataHeader.remove("DivisionDifficulty"); }

    // Adding child data
    List<String> AdditionDifficulty = new ArrayList<>();
    while (true) {
        if (T1 < 21) {
            String S1 = Integer.toString(T1);
            AdditionDifficulty.add(S1);
            T1++;
        } else {
            break;
        }
    }

    List<String> SubtractionDifficulty = new ArrayList<>();
    while (true) {
        if (T2 < 21) {
            String S2 = Integer.toString(T2);
            SubtractionDifficulty.add(S2);
            T2++;
        } else {
            break;
        }
    }

    List<String> MultiplicationDifficulty = new ArrayList<>();
    while (true) {
        if (T3 < 21) {
            String S3 = Integer.toString(T3);
            MultiplicationDifficulty.add(S3);
            T3++;
        } else {
            break;
        }
    }

    List<String> DivisionDifficulty = new ArrayList<>();
    while (true) {
        if (T4 < 21) {
            String S4 = Integer.toString(T4);
            DivisionDifficulty.add(S4);
            T4++;
        } else {
            break;
        }
    }

    /** this draws out the Expandable lists **/
    if(PS.AddProb) { listDataChild.put(listDataHeader.get(PS.ANum), AdditionDifficulty); } else {System.out.println("Something went wrong at line: 192"); Toast.makeText(getBaseContext(), "something went wrong: 192", Toast.LENGTH_SHORT).show();}
    if(PS.SubProb) { listDataChild.put(listDataHeader.get(PS.SNum), SubtractionDifficulty); } else {System.out.println("Something went wrong at line: 193"); Toast.makeText(getBaseContext(), "something went wrong: 193", Toast.LENGTH_SHORT).show();}
    if(PS.MultiProb) { listDataChild.put(listDataHeader.get(PS.MNum), MultiplicationDifficulty); } else {System.out.println("Something went wrong at line: 194"); Toast.makeText(getBaseContext(), "something went wrong: 194", Toast.LENGTH_SHORT).show();}
    if(PS.DivisProb) { listDataChild.put(listDataHeader.get(PS.DNum), DivisionDifficulty); } else {System.out.println("Something went wrong at line: 195"); Toast.makeText(getBaseContext(), "something went wrong: 195", Toast.LENGTH_SHORT).show();}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_difficulty_menu, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}
}

这是最后一堂课:

package com.spizer.mizer2;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.Toast;

public class ProblemSelector extends AppCompatActivity {

public boolean AddProb = true;
public boolean SubProb = false;
public boolean MultiProb = true;
public boolean DivisProb = false;

public int ANum = 0;
public int SNum;
public int MNum;
public int DNum;

//ProblemSelector PS = new ProblemSelector();

CheckBox checkbox1, checkbox2, checkbox3, checkbox4;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_problem_selector);

    checkbox1 = (CheckBox) findViewById(R.id.checkBox1);
    checkbox2 = (CheckBox) findViewById(R.id.checkBox2);
    checkbox3 = (CheckBox) findViewById(R.id.checkBox3);
    checkbox4 = (CheckBox) findViewById(R.id.checkBox4);

    /** waits for checkbox1 to be clicked then triggers the arguments below it **/
    /** also sets the lists position if the other problems for training have been selected to practice **/
    checkbox1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if (b) {
                AddProb = true;
                Toast.makeText(getBaseContext(), "Addition: True", Toast.LENGTH_SHORT).show();
                System.out.println("Addition: True");
            } else {
                AddProb = false;
                Toast.makeText(getBaseContext(), "Addition: False", Toast.LENGTH_SHORT).show();
                System.out.println("Addition: False");
            }
        }
    });

    /** waits for checkbox2 to be clicked then triggers the arguments below it **/
    /** also sets the lists position if the other problems for training have been selected to practice **/
    checkbox2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if (b) {
                SubProb = true;
                Toast.makeText(getBaseContext(), "Subtraction: True", Toast.LENGTH_SHORT).show();
                System.out.println("Subtraction: True");
                if(AddProb == false) {
                    SNum = 0;
                }
                else if(AddProb == true) {
                    SNum = 1;
                }
            } else {
                SubProb = false;
                Toast.makeText(getBaseContext(), "Subtraction: False", Toast.LENGTH_SHORT).show();
                System.out.println("Subtraction: False");
            }
        }
    });

    /** waits for checkbox3 to be clicked then triggers the arguments below it **/
    /** also sets the lists position if the other problems for training have been selected to practice **/
    checkbox3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if (b) {
                MultiProb = true;
                Toast.makeText(getBaseContext(), "Multiplication: True", Toast.LENGTH_SHORT).show();
                System.out.println("Multiplication: True");
                if(AddProb == false && SubProb == false) {
                    MNum = 0;
                }
                else if(AddProb == true && SubProb == false || AddProb == false && SubProb == true) {
                    MNum = 1;
                }
                else if(AddProb == true && SubProb == true) {
                    MNum = 2;
                }
            } else {
                MultiProb = false;
                Toast.makeText(getBaseContext(), "Multiplication: False", Toast.LENGTH_SHORT).show();
                System.out.println("Multiplication: False");
            }
        }
    });

    /** waits for checkbox4 to be clicked then triggers the arguments below it **/
    /** also sets the lists position if the other problems for training have been selected to practice **/
    checkbox4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
            if (b) {
                DivisProb = true;
                Toast.makeText(getBaseContext(), "Division: True", Toast.LENGTH_SHORT).show();
                System.out.println("Division: True");
                if(AddProb == false && SubProb == false && MultiProb == false) {
                    DNum = 0;
                }
                else if(AddProb == true && SubProb == false && MultiProb == false || AddProb == false && SubProb == true && MultiProb == false || AddProb == false && SubProb == false && MultiProb == true) {
                    DNum = 1;
                }
                else if(AddProb == true && SubProb == true && MultiProb == false || AddProb == false && SubProb == true && MultiProb == true || AddProb == true && SubProb == false && MultiProb == true) {
                    DNum = 2;
                }
                else if(AddProb == true && SubProb == true && MultiProb == true) {
                    DNum = 3;
                }
            } else {
                DivisProb = false;
                Toast.makeText(getBaseContext(), "Division: False", Toast.LENGTH_SHORT).show();
                System.out.println("Division: False");
            }
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_problem_selector, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

/** this is called when the user hits the continue button **/
public void DifficultyMenu(View view) {
    Intent DifficultyView = new Intent(this, DifficultyMenu.class);
    //DifficultyView.putExtra("addProb", PS.AddProb);
    //DifficultyView.putExtra("subProb", PS.SubProb);
    //DifficultyView.putExtra("multiProb", PS.MultiProb);
    //DifficultyView.putExtra("divisProb", PS.DivisProb);
    startActivity(DifficultyView);
}
}

1 个答案:

答案 0 :(得分:0)

我能够通过使用此方法来解决我的问题

String St1 = listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition);