添加数据时,notifyDataSetChanged()不更新列表视图

时间:2015-01-11 12:21:22

标签: java android listview android-listview

我正在阅读并在ListView中从3个不同的xml提要中添加数据,提取过程运行三次以执行三个不同的asynctasks。

以下是onPostExecute的代码,

if (fetchedData.isEmpty())
    fetchedData = result;
else 
    fetchedData.addAll(result);

if (sAdapter == null) {
    sAdapter = new SpecialAdapter(myapp.this, fetchedData,android.R.layout.simple_list_item_2, keys, ids);
    setListAdapter(sAdapter);
} else {
    sAdapter.notifyDataSetChanged();
}
上述代码fetchedData中的

ArrayList

上面的代码工作正常,并为所有3个Feed更新listView。但是,如果列表视图中添加了所有三个Feed的数据,我想在ArrayList中添加另一个ListView数据。

这意味着我想在加载所有Feed时添加数据,因此我添加了if块,

if (//all feeds added in the list) {
    Log.e("added","feeds added");
    // add another ArrayList in my ListView here 
    // and update the List adapter
}

这是上述if块的实际代码,

if (count == feeds.length) {

    Log.e("added","feeds added");
    //adding another arrayList in list view ArrayList
    fetchedData.addAll(test.secondryArray);
    // checking if it is added  (it is added successfully
    Log.e("size of fetchedData",fetchedData.size + "");
    // update the adapter
    sAdapter.notifyDataSetChanged();
}

if块中,我在列表视图数组列表中添加了一个新的arraylist并更新了SimpleAdapter,但由于某种原因,数据未显示在ListView中。我首先想到的数据没有添加到fetchedData的{​​{1}}数组中,但事实并非如此,因为数据已在test.secondaryArray数组中成功添加,但适配器未更新。

这是我完整的inPostExecute代码,

fetchedData

为什么在加载所有Feed后添加新数据后我的lsitview没有更新?

编辑:如果我在if (fetchedData.isEmpty()) fetchedData = result; else fetchedData.addAll(result); String[] keys = { GetFeeds.KEY_TITLE, GetFeeds.KEY_DATE}; int[] ids = { android.R.id.text1, android.R.id.text2 }; // KEY_TITLE = text1 // KEY_DATE = text2 if (sAdapter == null) { sAdapter = new SpecialAdapter(myapp.this, fetchedData,android.R.layout.simple_list_item_2, keys, ids); setListAdapter(sAdapter); } else { sAdapter.notifyDataSetChanged(); } if (count == feeds.length) { Log.e("added","feeds added"); //adding another arrayList in list view ArrayList fetchedData.addAll(test.secondryArray); // checking if it is added (it is added successfully Log.e("size of fetchedData",fetchedData.size + ""); // update the adapter sAdapter.notifyDataSetChanged(); } 块之外做同样的事情那么它正在工作但是在块内没有工作,但这不是我想要的,因为我希望这个代码只在所有的源码都是在此之前添加。

2 个答案:

答案 0 :(得分:1)

一种可能性是,第一次调用此方法时,您尝试使用MainThread(UIThread)通知listview,在第二种情况下(if条件变为true),您使用后台线程通知列表视图。

答案 1 :(得分:0)

如果之前ListView中没有数据,就会发生这种情况。 如果您的ListView为空,并且在添加数据后尝试执行notifyDataSetChanged()而不是初始化适配器,则ListView将保持为空。

因此,不要在适配器上使用notifyDataSetChanged(),而是为第二个数组重新初始化它。

在你的区块中,

if (count == feeds.length) {
    Log.e("added","feeds added");
    //adding another arrayList in list view ArrayList
    fetchedData.addAll(test.secondryArray);
    // checking if it is added  (it is added successfully
    Log.e("size of fetchedData",fetchedData.size + "");
    // update the adapter
    sAdapter.notifyDataSetChanged();
}

替换,

sAdapter.notifyDataSetChanged();

用,

sAdapter = new SpecialAdapter(myapp.this, fetchedData,android.R.layout.simple_list_item_2, keys, ids);
setListAdapter(sAdapter);