ArrayAdapter刷新数据

时间:2014-11-03 23:32:55

标签: java android android-arrayadapter futuretask

我正在构建一个动态填充/减少arraylist的应用程序,具体取决于与服务器通信的Futuretask线程。

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

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

在这个Futuretask中,只是冻结线程并导致应用程序故障。没有notifyonchange,当我用手指滑动调用ArrayAdapter的getView()时,它可以工作,但这是一种不受欢迎的行为。

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

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

/编辑:

我的删除方法如下所示:

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

(它在最后一个pharantesis结束时挂起)

2 个答案:

答案 0 :(得分:1)

  1. 将弱引用传递给其他线程中的活动,这样就不会泄漏上下文。

        WeakReference<Activity> mRef_Activity = new WeakReference<Activity>(activity);
    
  2. 从该线程中,在主要活动的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();
    
                }
            });
    
  3. 注意,如果您正在运行异步任务,而不是可调用或可运行,则可以将通知更新放在async的postExecute中,因为它是来自主UI线程的回调。

答案 1 :(得分:0)

  1. 使用静态变量引用意味着您应该谨慎使用该线程。据我所知,适配器仅在UI线程中更新数据。
  2. 您应该知道的另一件事是您应该实现getCount()函数来返回正确的数字。 当我的列表视图没有更新我的数据时,我遇到了问题。甚至我触发了onDatasetChange()。我忘记了getCount()函数