Android的 - 添加和使用ArrayAdapter一次显示项目的ListView 1 [英] Android - Adding and showing items to ListView one at a time using an ArrayAdapter

查看:227
本文介绍了Android的 - 添加和使用ArrayAdapter一次显示项目的ListView 1的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是ArrayAdapter将项目添加到自定义ListView和显示在我的Andr​​oid应用程序的结果。我遇到的问题是,一个ArrayAdapter似乎要等到所有项目都在上面则显示视图之前。这就是说,当我加入的项目,以一个ArrayAdapter和我称之为notifyDataSetChanged,它不更新ListView控件来显示添加的项目。它等待,直到所有的项目都显示出项目之前添加GetView被调用。

I'm using an ArrayAdapter to add items to a custom ListView and showing the results in my Android app. The problem I'm having is that the ArrayAdapter seems to wait until all items are in it before it shows the view. That is to say, when I'm adding the items to the ArrayAdapter and I call notifyDataSetChanged, it does not update the ListView to show the added item. It waits until all items are added and GetView is called before showing the items.

我想它做的是将它添加到ListView之后立即显示该项目。这可能吗?

What I would like it to do is to show the item immediately after adding it to the ListView. Is this possible?

我相信相关的code是以下内容:

I believe the relevant code is the following:

r_adapter = new ReminderAdapater(Activity_ContentSearch.this, R.layout.search_listitem, myList);
listView.setAdapter(r_adapter);
...
r_adapter.notifyDataSetChanged();
r_adapter.clear();
for(int i = 0; i < myList.size(); i++)
{
    r_adapter.add(myList.get(i));
    r_adapter.notifyDataSetChanged();
}

正如你所看到的,即使我add方法调用后notifyDataSetChanged,它实际上并没有更新视图。它已完成上述循环的观点是最后更新后(根据我所知道的,那是因为GetView不叫,直到code的这一部分后完成)。

As you can see, even though I am calling notifyDataSetChanged after the add method, it does not actually update the view. After it has finished the above loop the view is finally updated (based on what I know, that's because GetView isn't called until after this section of the code is done).

我试图重写我的自定义ArrayAdapter的添加方法,没有运气,因为我没有访问该方法中的视图。

I tried to override the add method of my custom ArrayAdapter with no luck, since I don't have access to the view in that method.

任何帮助将受到欢迎:)

Any help would be welcome :)

巴拉

推荐答案

Android的用户界面是单线程的。你是不是从主应用程序将控制权返回到Android的每次添加到该适配器的输入时间线程。因此,Android不得到一个机会,直到返回控件来显示你的条目,你不这样做,直到你已经填充了适配器的全部。

Android's UI is single-threaded. You are not giving control back to Android from the main application thread each time you add an entry to the adapter. Hence, Android does not get a chance to display your entries until you return control, and you're not doing that until you have populated your adapter in its entirety.

这里是显示了使用的一个例子的AsyncTask 来填补 ArrayAdapter 通过逐步后台线程。

Here is an example showing the use of an AsyncTask to fill an ArrayAdapter progressively via a background thread.

/***
  Copyright (c) 2008-2012 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain   a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS,   WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  From _The Busy Coder's Guide to Android Development_
    http://commonsware.com/Android
*/

package com.commonsware.android.async;

import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.ArrayAdapter;
import android.widget.Toast;
import java.util.ArrayList;

public class AsyncDemo extends ListActivity {
  private static final String[] items={"lorem", "ipsum", "dolor",
                                      "sit", "amet", "consectetuer",
                                      "adipiscing", "elit", "morbi",
                                      "vel", "ligula", "vitae",
                                      "arcu", "aliquet", "mollis",
                                      "etiam", "vel", "erat",
                                      "placerat", "ante",
                                      "porttitor", "sodales",
                                      "pellentesque", "augue",
                                      "purus"};
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    setListAdapter(new ArrayAdapter<String>(this,
                        android.R.layout.simple_list_item_1,
                        new ArrayList<String>()));

    new AddStringTask().execute();
  }

  class AddStringTask extends AsyncTask<Void, String, Void> {
    @Override
    protected Void doInBackground(Void... unused) {
      for (String item : items) {
        publishProgress(item);
        SystemClock.sleep(200);
      }

      return(null);
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void onProgressUpdate(String... item) {
      ((ArrayAdapter<String>)getListAdapter()).add(item[0]);
    }

    @Override
    protected void onPostExecute(Void unused) {
      Toast
        .makeText(AsyncDemo.this, "Done!", Toast.LENGTH_SHORT)
        .show();
    }
  }
}

这篇关于Android的 - 添加和使用ArrayAdapter一次显示项目的ListView 1的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆