0

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

问题是,当我将新对象添加到我的数组适配器中时,我以任何方式调用notifyDataSetChangedsetNotifyOnChange

(例如添加项目后,我还尝试制作一些调用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);
    }

(它最后挂在最后一个pharantesis)

4

2 回答 2

1
  1. 在其他线程中传递对活动的弱引用,因此您不会泄漏上下文。

        WeakReference<Activity> mRef_Activity = new WeakReference<Activity>(activity);
    
  2. 从该线程,在主活动的 ui 线程上运行通知更新。

        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 线程的回调。

于 2014-11-04T00:11:46.363 回答
0
  1. 使用静态变量引用意味着你应该在线程中小心。据我所知,适配器仅在 UI 线程中更新数据。
  2. 您应该知道的另一件事是您应该实现该getCount()函数以返回正确的数字。当我的列表视图没有更新我的数据时,我遇到了问题。即使我触发了 onDatasetChange()。我忘记了 getCount() 函数
于 2014-11-03T23:56:01.427 回答