在AsyncTask中更新ArrayAdapter的有效方法?

时间:2014-10-01 18:33:09

标签: java android arraylist android-asynctask

我正在使用XMLPullParser来解析XML提要,然后将传入的数据存储在List中。 问题是,我有多个提要来从中提取数据和单个列表,

我在做的是,

我创建了一个Arraylist来存储从XML中提取的数据,

protected ArrayList<String> feed_XMLs = new ArrayList<String>();

由于我有多个Feed,因此我将它们存储在一个数组中

  public static String XML_URL[] = { "http://Feed1",
            "http://Feed2",
            "http://Feed3",
            };

然后我在AsyncTask中使用PullParser从每个URL中提取数据并创建其对象,

for (int x = 0; x < XML_URL.length; x++){
    GetXMLTitles xmlFirst = new GetXMLTitles(x);
    xmlFirst.execute();
}

我在AsyncTask类中创建了一个构造函数,以便在每次迭代时选择不同的URL - &gt; new GetXMLTitles(x)

在每次迭代中,选择一个URL,然后将标题拉出并存储在ArrayList feed_XMLs中。

稍后在AsyncTask的onPostExecute内部方法中,此数据现在传递给ArrayAdapter,

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, feed_XMLs);

        setListAdapter(adapter);

多数人。

最终输出是一个巨大的ArrayList feed_XMLs,有数百个标题。

在每次迭代中,选择新的URL并更新feed_XMLs ArrayList并在屏幕上显示。

例如,

在第一次迭代时,选择了第一个网址,并且所有标题都存储在feed_XMLs中,feed_XMLs已更改。这些标题显示在屏幕上。

在第二次迭代时,选择第二个URL并将所有标题附加在feed_XMLs ...中,并且每次迭代都会持续进行。

问题是,

滚动条在每次迭代时都会在屏幕顶部移动,

例如,

如果我一直向下滚动并且ArrayAdapter已更新,我将自动在屏幕上一直向上移动,这不是我想要的。

我想让我的屏幕保持在ArrayAdapter中更新新数据时保持原样。

我怎样才能做到这一点?它甚至可能吗?

我试过了scrollview.fullScroll(View.FOCUS_DOWN);,但这也不起作用。

无论如何更新ArrayAdapter的方式是它在滚动中没有效果吗?

1 个答案:

答案 0 :(得分:2)

我认为问题是您在每个 onPostExecute

中创建了一个新的适配器
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, feed_XMLs);

    setListAdapter(adapter);

只需创建一次适配器并更新它的数据。

这样的事情:

if(adapter!=null) {
     adapter.notifyDataSetChanged();
}

修改:

谢谢你这个解决方案有效!

我在主类中创建adapter,就像这样,

ArrayAdapter<String> adapter;

然后在onPostExecute

if (adapter == null) {
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, feed_XMLs);
        setListAdapter(adapter);
        }

        else {
             adapter.notifyDataSetChanged();
        }