2014-11-04 51 views
0

我想另一项活动后更新ListViewfinish()“与结果上课。初始化(正常工作):的Android ArrayAdapter为ListView的方法.notifyDataSetChanged()问题

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

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

回答

0

在你的第一个例子,你给的信息问卷变量,我没有看到正在与您的列表视图。 onNotifyDataSetChanged()和我之前说的具有相同的数据。

第二个作品,因为你是直接更改对象变量连接到您的适配器。

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

+0

,我真的很抱歉!我试图简化这个问题的代码。 '问卷'='对象'。 '两个例子中的ArrayList'都是相同的(现在更新)。对不起... – 2014-11-04 21:10:44

+0

哦好吧,我不知道,但我认为obectsListView本身需要在调用onNotifyDataSetChanged之前进行操作。例如:objectsListView.clear,.add等 – Lukos 2014-11-04 21:51:16

+0

嗯...我真的不这么认为,因为我之前成功地完成了类似的功能。不同之处在于我将数据添加到数组中,如下所示:'objects.add(newObject);'。这里'objectsListView'也不会被操纵,不是吗? – 2014-11-05 05:31:28