在我的应用中,我希望用户查看城市列表,选择城市,然后查看与该城市相关联的用户。
所以,我有这个来获取数据:
protected void onResume() {
super.onResume();
setProgressBarIndeterminateVisibility(true);
ParseQuery<ParseUser> query = ParseUser.getQuery();
query.orderByAscending(ParseConstants.KEY_LOCATION);
query.setLimit(1000);
query.findInBackground(new FindCallback<ParseUser>() {
@Override
public void done(List<ParseUser> users, ParseException e) {
setProgressBarIndeterminateVisibility(false);
if (e == null) {
// Success
mMidwifeLocation = users;
String[] locations = new String[mMidwifeLocation.size()];
String check;
int i = 0;
for(ParseUser user : mMidwifeLocation) {
check=user.getString("city");
if(check!=null){
if(!Arrays.asList(locations).contains(check)){
locations[i] = user.getString("city");
}
}
i++;
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
SearchingMidwife.this,
android.R.layout.simple_list_item_checked,
locations);
setListAdapter(adapter);
}
else {
Log.e(TAG, e.getMessage());
AlertDialog.Builder builder = new AlertDialog.Builder(SearchingMidwife.this);
builder.setMessage(e.getMessage())
.setTitle(R.string.error_title)
.setPositiveButton(android.R.string.ok, null);
AlertDialog dialog = builder.create();
dialog.show();
}
}
});
这是将所选项目传递给新活动:
@Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id);
SparseBooleanArray checked = l.getCheckedItemPositions();
ArrayList<String> selectedItems = new ArrayList<String>();
for (int i = 0; i < checked.size(); i++) {
// Item position in adapter
position = checked.keyAt(i);
// Add sport if it is checked i.e.) == TRUE!
if (checked.valueAt(i))
selectedItems.add(adapter.getItem(position));
}
String[] outputStrArr = new String[selectedItems.size()];
for (int i = 0; i < selectedItems.size(); i++) {
outputStrArr[i] = selectedItems.get(i);
}
Intent intent = new Intent(getApplicationContext(),
MidwifeResultList.class);
// Create a bundle object
Bundle b = new Bundle();
b.putStringArray("selectedItems", outputStrArr);
// Add the bundle to the intent.
intent.putExtras(b);
// start the ResultActivity
startActivity(intent);
}
当我尝试时,一旦我选择了项目,应用程序就会停止并显示错误...
致命的例外:主程序:android.bignerdranch.com.mobilemidwife, PID:31604 java.lang.NullPointerException at android.bignerdranch.com.mobilemidwife.SearchingMidwife.onListItemClick(SearchingMidwife.java:169)
指出这一点:
if (checked.valueAt(i)) selectedItems.add(adapter.getItem(position)); }
我在onCreate之前声明了适配器:
ArrayAdapter adapter;
我认为这是OnResume中使用的同一个适配器......有些东西不太正确,不确定那是什么。似乎来自onResume的适配器没有传递给onResume,因为它是null。
我对此有点新意,所以我尽力学习这一点;如果问题遗漏了很简单,我道歉。
非常感谢你的帮助/见解
Michael Cabus
答案 0 :(得分:-1)
你的问题在这里:
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
SearchingMidwife.this,
android.R.layout.simple_list_item_checked,
locations);
这是创建一个local
变量,它只在方法范围内。
将其更改为
adapter = new ArrayAdapter<String>(
SearchingMidwife.this,
android.R.layout.simple_list_item_checked,
locations);
删除前导ArrayAdapter<String>
,这应解决此特定问题。
<强>更新强>
我是否可以建议使用不同的编码方式,例如将前导下划线添加到类成员变量中,以便将来更容易检测到这些问题?它只是一个建议,但我发现它非常有助于适应这种特殊的风格。
我的意思是例如将变量声明为
ArrayAdapter _adapter;
在你的课堂上,然后像这样设置:
_adapter = new ArrayAdapter<String>(
SearchingMidwife.this,
android.R.layout.simple_list_item_checked,
locations);
现在每当你看到&#34; _&#34;时,它表明它是一个成员变量而不是一个局部变量(因为你会声明没有前导下划线的变量)。
只是个人建议。由您决定采用或留下它。