Android,将数据传递到新的Activity(包)

时间:2015-04-13 16:53:33

标签: android

在我的应用中,我希望用户查看城市列表,选择城市,然后查看与该城市相关联的用户。

所以,我有这个来获取数据:

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

1 个答案:

答案 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;时,它表明它是一个成员变量而不是一个局部变量(因为你会声明没有前导下划线的变量)。

只是个人建议。由您决定采用或留下它。