java - ArrayAdapter刷新数据

标签 java android android-arrayadapter futuretask

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

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

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

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

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

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

/编辑:

我的删除方法如下所示:

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

(它卡在最后一个 pharantesis 的末尾)

最佳答案

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

        WeakReference<Activity> mRef_Activity = new WeakReference<Activity>(activity);
    
  2. 从该线程中,在主 Activity 的 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 线程的回调。

关于java - ArrayAdapter刷新数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26725220/

相关文章:

android - 微调器中的图像+ TextView +单选按钮

java - 为什么计数器没有在上述 for 循环中初始化?

java - 第一个字母的样式

java - 当我在第一个微调器中再次选择一个项目时发生错误,然后相关数据不会在第二个微调器中解析意味着它不会刷新

android - 使 Imageview 假定其父级允许的最大宽度

Android SQLiteOpenHelper 错误 - 对 super 的调用必须是构造函数中的第一条语句

Android自定义ArrayAdapter在过滤后不刷新

java - 是什么导致 Spring 调度程序在应用程序和 servlet 启动之前执行?

java - 我如何从 jasperserver 获取报告

java - 无法访问内部类中的LinkedHashMap