ExpandableListAdapter.getChild() 处的 NullPointerException
NullPointerException at ExpandableListAdapter.getChild()
在这里卡了一个多星期了还是没解决!我有一个 expandable listView
,其中从 SQLite
检索数据并设置为 expListAdapter
。单击箭头后,将显示两个子项。
添加每月费用
public class AddMonthlyExpenses extends AppCompatActivity {
ArrayList<ListObj> groupList= new ArrayList<ListObj>();;
List<String> childList;
Map<ListObj, List<String>> laptopCollection;
ExpandableListView listview;
ExpandableListAdapter expListAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_monthly_expenses);
laptopCollection = new LinkedHashMap<ListObj, List<String>>();
listview = (ExpandableListView) findViewById(R.id.exlistView);
expListAdapter = new ExpandableListAdapter(getApplication(), groupList, laptopCollection);
listview.setAdapter(expListAdapter);
retrieveList(name);
}
public void retrieveList(String name) {
database = mdb.getReadableDatabase();
Cursor cursor = database.rawQuery("SELECT * FROM " + MyDatabaseHelper.TABLE__TASK + " WHERE Name = ? ", new String[]{name}, null);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
groupList = new ArrayList<ListObj>();
int iD = cursor.getInt(cursor.getColumnIndex("ID"));
String month = cursor.getString(cursor.getColumnIndex("Month"));
double budget = cursor.getDouble(cursor.getColumnIndex("Budget"));
groupList.add(new ListObj(iD,month,budget));
if (expListAdapter != null) {
expListAdapter.add(iD, month, budget);
createCollection(); // for child items
listview.setAdapter(expListAdapter);
}
}
}
}
private void createCollection() {
String[] options = {"Edit","Delete"};
for (ListObj laptop : groupList) {
loadChild(options);
laptopCollection.put(laptop, childList);
}
}
private void loadChild(String[] laptopModels) {
childList = new ArrayList<String>();
for (String model : laptopModels)
childList.add(model);
}
}
ExpandableListAdapter
public class ExpandableListAdapter extends BaseExpandableListAdapter {
private Context context;
Map<ListObj, List<String>> laptopCollections;
private ArrayList<ListObj> laptops;
double used = 0;
private LayoutInflater mInflater;
public ExpandableListAdapter(Context context, ArrayList<ListObj> laptops, Map<ListObj, List<String>> laptopCollections) {
this.context = context;
this.laptopCollections = laptopCollections;
this.laptops = laptops;
mInflater = LayoutInflater.from(context);
}
public Object getChild(int groupPosition, int childPosition) { // error line
if (laptopCollections.get(laptops.get(groupPosition)).get(childPosition) != null && !laptopCollections.get(laptops.get(groupPosition)).get(childPosition).isEmpty()) {
return laptopCollections.get(laptops.get(groupPosition)).get(childPosition);
}
return 1;
}
public void add(int id, String month, double budget) {
String[] splited = month.split("\s+");
ListObj obj = new ListObj(id, month, budget);
obj.setYear(splited[1]);
obj.setMonth(splited[0]);
obj.setBudget(budget);
obj.setID(id);
laptops.add(obj);
this.notifyDataSetChanged();
}
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
public int getCount() {
return laptops.size();
}
public ListObj getItem(int position) {
return laptops.get(position);
}
public View getChildView(final int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final String laptop = (String) getChild(groupPosition, childPosition); // here the error line
if (convertView == null) {
convertView = inflater.inflate(R.layout.child_item, null);
}
TextView edit = (TextView) convertView.findViewById(R.id.textEdit);
edit.setText(laptop);
return convertView;
}
public int getChildrenCount(int groupPosition) {
if (laptopCollections.get(laptops.get(groupPosition)) != null && ! laptopCollections.get(laptops.get(groupPosition)).isEmpty()) {
return laptopCollections.get(laptops.get(groupPosition)).size();
}
return 1;
}
public Object getGroup(int groupPosition) {
return laptops.get(groupPosition);
}
public int getGroupCount() {
return this.laptops.size();
}
public long getGroupId(int groupPosition) {
return groupPosition;
}
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
ExpensesAdapter.ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.expenses_adapter, null);
holder = new ExpensesAdapter.ViewHolder();
holder.month = (TextView) convertView.findViewById(R.id.textMonth);
holder.budget = (TextView) convertView.findViewById(R.id.textAmount);
holder.year = (TextView) convertView.findViewById(R.id.textYear);
convertView.setTag(holder);
} else {
holder = (ExpensesAdapter.ViewHolder) convertView.getTag();
}
holder.month.setText(laptops.get(groupPosition).getMonth());
holder.budget.setText(String.format("%.2f", laptops.get(groupPosition).getBudget()));
holder.year.setText(laptops.get(groupPosition).getYear());
return convertView;
}
public boolean hasStableIds() {
return true;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
错误
10-26 00:03:57.114 23612-23612/com.example.tony.monthlyexpenses
E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException
at
com.example.tony.monthlyexpenses.adapter.ExpandableListAdapter.getChild(ExpandableListAdapter.java:42)
at
com.example.tony.monthlyexpenses.adapter.ExpandableListAdapter.getChildView(ExpandableListAdapter.java:87)
at
android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:451)
at android.widget.AbsListView.obtainView(AbsListView.java:2232)
at android.widget.ListView.makeAndAddView(ListView.java:1849)
at android.widget.ListView.fillDown(ListView.java:678)
at android.widget.ListView.fillSpecific(ListView.java:1339)
我的应用程序屏幕截图
我尝试调试但没有任何内容为空!
您可以从下面的 link 克隆我的项目
添加 createCollection();到 button1 setonclick listner
createCollection();
groupList = new ArrayList();写在for循环里面可能有问题?它为每个循环创建一个新的数组列表,因此您的数组大小始终为 1(最后一次迭代计数)
while (cursor.moveToNext()) {
groupList = new ArrayList<ListObj>();
int iD = cursor.getInt(cursor.getColumnIndex("ID"));
String month = cursor.getString(cursor.getColumnIndex("Month"));
double budget = cursor.getDouble(cursor.getColumnIndex("Budget"));
groupList.add(new ListObj(iD,month,budget));
createCollection(); // for child items
if (expListAdapter != null) {
expListAdapter.add(iD, month, budget);
listview.setAdapter(expListAdapter);
}
}
改为
groupList = new ArrayList<ListObj>();
while (cursor.moveToNext()) {
int iD = cursor.getInt(cursor.getColumnIndex("ID"));
String month = cursor.getString(cursor.getColumnIndex("Month"));
double budget = cursor.getDouble(cursor.getColumnIndex("Budget"));
groupList.add(new ListObj(iD,month,budget));
createCollection(); // for child items
if (expListAdapter != null) {
expListAdapter.add(iD, month, budget);
listview.setAdapter(expListAdapter);
}
}
我认为在你的代码中不起作用
laptopCollections.get(laptops.get(groupPosition)).size();
因为尝试找到其他对象实例。
你的片段和适配器中有这么多列表,你真的不需要这个。尝试保留 OOP 并重构它并为此创建更好的模型。
或者更简单的方法不要用于映射键对象,而是使用 id。
从
Map<ListObj, List<String>> laptopCollections
到
Map<String,List<String>> laptopCollections
其中第一个 K 是 id。
也许会有帮助。
我 运行 一两年前遇到过类似的问题。不记得是哪个版本了。
从通话开始
public Object getChild(int groupPosition, int childPosition) {
if (laptopCollections.get(laptops.get(groupPosition)).get(childPosition) ...
笔记本电脑的价值是多少?它是用构造函数初始化的
public ExpandableListAdapter(Context context, ArrayList<ListObj> laptops ...
在第二个参数上,它是在 AddMonthlyExpenses.onCreate()
上创建的
expListAdapter =
new ExpandableListAdapter(getApplication(), groupList, laptopCollection);
并在声明中初始化
ArrayList<ListObj> groupList= new ArrayList<ListObj>();;
出于某种我不知道的原因 - Android 特性 - 在我的例子中,这个 groupList
(或我拥有的类似成员字段)是 NULL
,即使它是在声明时初始化的。
但是将初始化移动到内部 onCreate()
解决了这个问题。
试试看。或者至少调试引用 laptops
的行。
在这里卡了一个多星期了还是没解决!我有一个 expandable listView
,其中从 SQLite
检索数据并设置为 expListAdapter
。单击箭头后,将显示两个子项。
添加每月费用
public class AddMonthlyExpenses extends AppCompatActivity {
ArrayList<ListObj> groupList= new ArrayList<ListObj>();;
List<String> childList;
Map<ListObj, List<String>> laptopCollection;
ExpandableListView listview;
ExpandableListAdapter expListAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.add_monthly_expenses);
laptopCollection = new LinkedHashMap<ListObj, List<String>>();
listview = (ExpandableListView) findViewById(R.id.exlistView);
expListAdapter = new ExpandableListAdapter(getApplication(), groupList, laptopCollection);
listview.setAdapter(expListAdapter);
retrieveList(name);
}
public void retrieveList(String name) {
database = mdb.getReadableDatabase();
Cursor cursor = database.rawQuery("SELECT * FROM " + MyDatabaseHelper.TABLE__TASK + " WHERE Name = ? ", new String[]{name}, null);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
groupList = new ArrayList<ListObj>();
int iD = cursor.getInt(cursor.getColumnIndex("ID"));
String month = cursor.getString(cursor.getColumnIndex("Month"));
double budget = cursor.getDouble(cursor.getColumnIndex("Budget"));
groupList.add(new ListObj(iD,month,budget));
if (expListAdapter != null) {
expListAdapter.add(iD, month, budget);
createCollection(); // for child items
listview.setAdapter(expListAdapter);
}
}
}
}
private void createCollection() {
String[] options = {"Edit","Delete"};
for (ListObj laptop : groupList) {
loadChild(options);
laptopCollection.put(laptop, childList);
}
}
private void loadChild(String[] laptopModels) {
childList = new ArrayList<String>();
for (String model : laptopModels)
childList.add(model);
}
}
ExpandableListAdapter
public class ExpandableListAdapter extends BaseExpandableListAdapter {
private Context context;
Map<ListObj, List<String>> laptopCollections;
private ArrayList<ListObj> laptops;
double used = 0;
private LayoutInflater mInflater;
public ExpandableListAdapter(Context context, ArrayList<ListObj> laptops, Map<ListObj, List<String>> laptopCollections) {
this.context = context;
this.laptopCollections = laptopCollections;
this.laptops = laptops;
mInflater = LayoutInflater.from(context);
}
public Object getChild(int groupPosition, int childPosition) { // error line
if (laptopCollections.get(laptops.get(groupPosition)).get(childPosition) != null && !laptopCollections.get(laptops.get(groupPosition)).get(childPosition).isEmpty()) {
return laptopCollections.get(laptops.get(groupPosition)).get(childPosition);
}
return 1;
}
public void add(int id, String month, double budget) {
String[] splited = month.split("\s+");
ListObj obj = new ListObj(id, month, budget);
obj.setYear(splited[1]);
obj.setMonth(splited[0]);
obj.setBudget(budget);
obj.setID(id);
laptops.add(obj);
this.notifyDataSetChanged();
}
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
public int getCount() {
return laptops.size();
}
public ListObj getItem(int position) {
return laptops.get(position);
}
public View getChildView(final int groupPosition, final int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final String laptop = (String) getChild(groupPosition, childPosition); // here the error line
if (convertView == null) {
convertView = inflater.inflate(R.layout.child_item, null);
}
TextView edit = (TextView) convertView.findViewById(R.id.textEdit);
edit.setText(laptop);
return convertView;
}
public int getChildrenCount(int groupPosition) {
if (laptopCollections.get(laptops.get(groupPosition)) != null && ! laptopCollections.get(laptops.get(groupPosition)).isEmpty()) {
return laptopCollections.get(laptops.get(groupPosition)).size();
}
return 1;
}
public Object getGroup(int groupPosition) {
return laptops.get(groupPosition);
}
public int getGroupCount() {
return this.laptops.size();
}
public long getGroupId(int groupPosition) {
return groupPosition;
}
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
ExpensesAdapter.ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.expenses_adapter, null);
holder = new ExpensesAdapter.ViewHolder();
holder.month = (TextView) convertView.findViewById(R.id.textMonth);
holder.budget = (TextView) convertView.findViewById(R.id.textAmount);
holder.year = (TextView) convertView.findViewById(R.id.textYear);
convertView.setTag(holder);
} else {
holder = (ExpensesAdapter.ViewHolder) convertView.getTag();
}
holder.month.setText(laptops.get(groupPosition).getMonth());
holder.budget.setText(String.format("%.2f", laptops.get(groupPosition).getBudget()));
holder.year.setText(laptops.get(groupPosition).getYear());
return convertView;
}
public boolean hasStableIds() {
return true;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
错误
10-26 00:03:57.114 23612-23612/com.example.tony.monthlyexpenses E/AndroidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException at com.example.tony.monthlyexpenses.adapter.ExpandableListAdapter.getChild(ExpandableListAdapter.java:42) at com.example.tony.monthlyexpenses.adapter.ExpandableListAdapter.getChildView(ExpandableListAdapter.java:87) at android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:451) at android.widget.AbsListView.obtainView(AbsListView.java:2232) at android.widget.ListView.makeAndAddView(ListView.java:1849) at android.widget.ListView.fillDown(ListView.java:678) at android.widget.ListView.fillSpecific(ListView.java:1339)
我的应用程序屏幕截图
我尝试调试但没有任何内容为空!
您可以从下面的 link 克隆我的项目
添加 createCollection();到 button1 setonclick listner
createCollection();
groupList = new ArrayList();写在for循环里面可能有问题?它为每个循环创建一个新的数组列表,因此您的数组大小始终为 1(最后一次迭代计数)
while (cursor.moveToNext()) {
groupList = new ArrayList<ListObj>();
int iD = cursor.getInt(cursor.getColumnIndex("ID"));
String month = cursor.getString(cursor.getColumnIndex("Month"));
double budget = cursor.getDouble(cursor.getColumnIndex("Budget"));
groupList.add(new ListObj(iD,month,budget));
createCollection(); // for child items
if (expListAdapter != null) {
expListAdapter.add(iD, month, budget);
listview.setAdapter(expListAdapter);
}
}
改为
groupList = new ArrayList<ListObj>();
while (cursor.moveToNext()) {
int iD = cursor.getInt(cursor.getColumnIndex("ID"));
String month = cursor.getString(cursor.getColumnIndex("Month"));
double budget = cursor.getDouble(cursor.getColumnIndex("Budget"));
groupList.add(new ListObj(iD,month,budget));
createCollection(); // for child items
if (expListAdapter != null) {
expListAdapter.add(iD, month, budget);
listview.setAdapter(expListAdapter);
}
}
我认为在你的代码中不起作用
laptopCollections.get(laptops.get(groupPosition)).size();
因为尝试找到其他对象实例。
你的片段和适配器中有这么多列表,你真的不需要这个。尝试保留 OOP 并重构它并为此创建更好的模型。
或者更简单的方法不要用于映射键对象,而是使用 id。
从
Map<ListObj, List<String>> laptopCollections
到
Map<String,List<String>> laptopCollections
其中第一个 K 是 id。
也许会有帮助。
我 运行 一两年前遇到过类似的问题。不记得是哪个版本了。
从通话开始
public Object getChild(int groupPosition, int childPosition) {
if (laptopCollections.get(laptops.get(groupPosition)).get(childPosition) ...
笔记本电脑的价值是多少?它是用构造函数初始化的
public ExpandableListAdapter(Context context, ArrayList<ListObj> laptops ...
在第二个参数上,它是在 AddMonthlyExpenses.onCreate()
expListAdapter =
new ExpandableListAdapter(getApplication(), groupList, laptopCollection);
并在声明中初始化
ArrayList<ListObj> groupList= new ArrayList<ListObj>();;
出于某种我不知道的原因 - Android 特性 - 在我的例子中,这个 groupList
(或我拥有的类似成员字段)是 NULL
,即使它是在声明时初始化的。
但是将初始化移动到内部 onCreate()
解决了这个问题。
试试看。或者至少调试引用 laptops
的行。