用于ListView方法的Android ArrayAdapter .notifyDataSetChanged()问题

时间:2014-11-04 20:53:05

标签: android android-activity android-listview

我正在尝试使用结果更新ListView之后的另一个活动finish()。初始化(正常工作):

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    databaseHelper = new DatabaseHelper(this);

    objects = databaseHelper.selectObjects();

    objectsListView = (ListView) findViewById(R.id.LIST_VIEW_OBJECTS);

    objectArrayAdapter = new ArrayAdapter<Object>(this, android.R.layout.simple_list_item_1, objects);

    objectsListView.setAdapter(objectArrayAdapter);
}

仅在我尝试更新ListView时出现问题:

@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data) {

    if(requestCode == SECOND_ACTIVITY_REQUEST) {

        if (resultCode == RESULT_OK) {

            objects = databaseHelper.selectObjects();

            objectArrayAdapter.notifyDataSetChanged();
        }

        if (resultCode == RESULT_CANCELED) {

            Toast.makeText(getApplicationContext(), getResources().getString(R.string.TOAST_ERROR_RESULT_CANCELED), Toast.LENGTH_LONG).show();
        }
    }
}

但是这段代码运行得很好:

@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data) {

    if(requestCode == SECOND_ACTIVITY_REQUEST) {

        if (resultCode == RESULT_OK) {

            objects.add(newObject);

            objectArrayAdapter.notifyDataSetChanged();
        }

        if (resultCode == RESULT_CANCELED) {

            Toast.makeText(getApplicationContext(), getResources().getString(R.string.TOAST_ERROR_RESULT_CANCELED), Toast.LENGTH_LONG).show();
        }
    }
}

此代码也可以正常使用:

@Override
protected void onActivityResult (int requestCode, int resultCode, Intent data) {

    if(requestCode == SECOND_ACTIVITY_REQUEST) {

        if (resultCode == RESULT_OK) {

            objects = databaseHelper.selectObjects();

            objectArrayAdapter = new ArrayAdapter<Object>(this, android.R.layout.simple_list_item_1, objects);

            objectsListView.setAdapter(objectArrayAdapter);
        }

        if (resultCode == RESULT_CANCELED) {

            Toast.makeText(getApplicationContext(), getResources().getString(R.string.TOAST_ERROR_RESULT_CANCELED), Toast.LENGTH_LONG).show();
        }
    }
}

我的问题是:为什么第一种方法不能按预期工作?第二和第三似乎是一轮工作不是吗?

1 个答案:

答案 0 :(得分:0)

在您的第一个示例中,您将信息提供给问卷变量,我认为这与您的列表视图无关。 onNotifyDataSetChanged()与我之前的数据相同。

<击>

第二个可行,因为您正在直接更改连接到适配器的对象变量。

编辑: “对于ArrayAdapter,只有在适配器上使用add(),insert(),remove()和clear()时,notifyDataSetChanged才有效。” notifyDataSetChanged example