我正在构建一个应用程序,该应用程序根据与服务器通信的Futuretask线程来动态填充/减少阵列列表。

问题是当我将新对象添加到我的arrayadapter中时,我以任何方式调用notifyDataSetChanged或setNotifyOnChange

(例如,在添加项目之后,我还尝试制作一些调用notifyDataSetChanged的postadd函数,甚至尝试在适配器构造函数中添加setNotifyOnChange,或者在添加(adapter.setNotifyOnChange(true))之前)

在此Futuretask中,它只是冻结线程并导致应用程序故障。当我用手指滑动以调用ArrayAdapter的getView()时,如果没有notifyonchange,它将起作用,但这是不希望的行为。

注意:我正在通过静态变量引用访问适配器。

注意#2:我不认为一次又一次地创建新适配器是一个明智的选择。

/编辑:

我的删除方法如下所示:

public void remove (int itemid) {
        for (ContactItem i : items)
            if (i.ID == itemid)
                items.remove(i);
    }


(它最后挂在最后一个法网)

最佳答案

在另一个线程中传递对活动的弱引用,这样就不会泄漏上下文。

    WeakReference<Activity> mRef_Activity = new WeakReference<Activity>(activity);

在该线程中,在主要活动的ui线程上运行notify update。

    final Activity activity = mRef_Activity.get();
    if(activity != null)
        activity.runOnUiThread(new Runnable() {

            @Override
            public void run() {

                ArrayAdapter<String>  adapter = activity.getAdapter();
                adapter.notifyDataSetChanged();

            }
        });



请注意,如果您正在运行异步任务,而不是可调用或可运行的任务,则只需将通知更新放在异步的postExecute中,因为它是来自主UI线程的回调。

07-24 09:27