【问题标题】:Efficient way to update the ArrayAdapter inside AsyncTask?更新 AsyncTask 中的 ArrayAdapter 的有效方法?
【发布时间】:2014-10-01 18:33:08
【问题描述】:

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

我正在做的是,

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

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

由于我有多个提要,我将它们存储在一个数组中

  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 -> 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 会更新并显示在屏幕上。

例如,

在第一次迭代时,第一个 URL 被选中,所有标题都存储在 feed_XMLs 中,feed_XMLs 被更改。这些标题显示在屏幕上。

在第二次迭代时,第二个 URL 被选中,所有标题都附加在 feed_XMLs...中,并且每次迭代的过程都是连续的。

问题是,

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

例如,

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

我希望我的屏幕在 ArrayAdapter 中更新新数据时保持在原来的位置。

我怎样才能做到这一点?有可能吗?

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

是否有办法更新 ArrayAdapter 使其对滚动没有影响??

【问题讨论】:

    标签: java android arraylist android-asynctask


    【解决方案1】:

    我认为问题在于您在每个 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();
            }
    

    【讨论】:

    • 既然Adapter是在onPostExecute里面创建的,那不是每次迭代都会自动创建的吗?我无法在主活动类中创建 ArrayAdapter,因为那时 feed_XMLs 数据不会更新,我必须在 Async onPostExecute 中创建 ArrayAdapter,但是如何只创建一次呢? P.S:您的解决方案不起作用
    • 当您保留一个适配器实例时,该解决方案有效。只需在主活动上保留对适配器的引用,创建一次适配器(onPostExecute),然后更新适配器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 2014-06-19
    • 2023-04-01
    相关资源
    最近更新 更多