【问题标题】:Android ArrayAdapter for ListView method .notifyDataSetChanged() issue用于 ListView 方法的 Android ArrayAdapter .notifyDataSetChanged() 问题
【发布时间】:2014-11-04 20:53:04
【问题描述】:

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

@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();
        }
    }
}

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

【问题讨论】:

    标签: android android-activity android-listview


    【解决方案1】:

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

    第二个有效,因为您正在直接更改连接到适配器的 objects 变量。

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

    【讨论】:

    • 真的很抱歉!我试图为这个问题简化我的代码。 questionnaires = objects。两个示例中的ArrayList 相同(现已更新)。再次抱歉...
    • 哦,好吧,我不确定,但我认为 obectsListView 本身需要在调用 onNotifyDataSetChanged 之前进行操作。例如:objectsListView.clear、.add 等
    • 嗯...我真的不这么认为,因为我之前已经成功地完成了类似的功能。不同之处在于我将数据添加到这样的数组中:objects.add(newObject);。这里objectsListView也没有被操纵,不是吗?
    • 我认为适配器仍然持有对旧值的引用。这应该可以解决问题。 stackoverflow.com/questions/3669325/…
    • 但是如果我说objectArrayAdapter.notifyDataSetChanged();,这个方法不应该用新数据集刷新所有列表吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多