如何从完全不相关的类更新ListView

BeneStr

我已经阅读了很多有关如何更新ListView的问题。他们几乎都说出adapter.notifyDataSetChanged()(如果在带有runOnUiThread的单独线程中)。

我的问题开始得更早:我什至如何获得所需的适配器,或者为此,一个Activity调用runOnUiThread?

这是我当前代码的非常简化的版本:

我有一个数据类,可以随时随地更新。update方法需要启动一个新的Thread,这就是为什么我不能简单地等待返回值的原因。

class Data {
private static double[] data = new double[7]

public static void update(final Context context) {

    new Thread(new Runnable() {
        @Override
        public void run() {
              //do lots of complicated stuff
        }
    }).start();
}

public double[] getData {
    return data;
}

我有一个Activity(不是主要的Activity),其中包含ListView

public class ListViewActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_ListView);
    ListView listView = (ListView) findViewById(R.id.MyListView);
    listView.setAdapter(new CustomListViewAdapter(this));
}

然后,我使用自定义适配器以所需的方式设置ListView。

class CustomListViewAdapter extends BaseAdapter {

private final LayoutInflater layoutInflater;

public CustomListViewAdapter(Context context) {
    layoutInflater = LayoutInflater.from(context);
}

@Override
public View getView(int position, View view, ViewGroup parent) {
    ViewHolder viewHolder = new ViewHolder();
    if (view == null) {
        view = layoutInflater.inflate(R.layout.listView_row_layout, parent, false);
        viewHolder.value = (TextView) view.findViewById(R.id.listViewDataTextField);
        view.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) view.getTag();
    }
    double data = Data.getData()[position];
    viewHolder.value.setText(data+"");

    return view;
}
private class ViewHolder {
    TextView value;
}

现在,我想在update()方法中的线程完成获取新数据后立即使用ListView更新。获取数据可能需要花费几秒钟的时间,因此无法预测到那时将激活哪些活动。如果我的ListViewActivity是活动的,我希望ListView立即更改为新数据。

那么,如何在另一个线程中从另一个类(不是Activity)更新该ListView?我不认为将适配器放在静态字段中是个好主意,因为ListViewActivity可能一直被创建和销毁?但是我还有什么其他选择?

奥列格(Oleg Gryb)

extendIt似乎可以将您的主要问题简短地表述为“我什至如何获得适配器”,因此,我将尝试解决该问题。让我们尝试使用旧的Java单例来解决该问题。这个想法是为您需要更新的所有视图创建全局配置并预创建适配器:

    public class GlobalConfig {

        private static GlobalConfig config = null;
        private CustomBaseAdapterOne adapter1 = null;
        private CustomBaseAdapterTwo adapter2 = null;
        public GlobalConfig getAdapterOne() {return adapter1;}
        public GlobalConfig getAdapterTwo() {return adapter2;}

        public static synchronized GlobalConfig getInstance() {
            if (config == null) {
                config = new GlobalConfig();
                config.adapter1 = new CustomBaseAdapterOne();
                config.adapter2 = new CustomBaseAdapterTwo();
            }
            return config;
        }
    }

您的ListViewActivity将需要扩展DataSetObserver类并在启动时注册一个观察器。您的CustomListAdapter启动时需要注册观察者,并且还需要能够通过函数(例如setContext)(而不是通过构造函数)使用初始化参数(在您的情况下为Context)进行初始化,因此在ListViewActivity中,将需要执行以下操作:

GlobalConfig cfg = GlobalConfig.getInstance();
CustomerAdapterOne ad = cfg.getAdapterOne();
ad.setContext(this);
ad.registerDataSetObserver(this);

从需要更新ListView的单独线程中,将运行:

GlobalConfig cfg = GlobalConfig.getInstance();
try {
    cfg.getAdapterOne().notifyDataSetChanged();
}
catch{... }

我认为,在此处尝试/捕获是个好主意,因为我不知道如果ListView在需要通知时已经死亡,将会发生什么。

总结一下:您需要为每个需要更新的视图预先创建一个适配器,并将其全局提供给所有需要它的人。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

for循环重新分配完全不相关的变量

来自分类Dev

nodejs,函数无缘无故跳到完全不相关的行?

来自分类Dev

更改完全不相关的代码时,Visual Studio C ++编译器生成慢3倍的代码

来自分类Dev

如何加快不相关数据的for循环?

来自分类Dev

雄辩。如何获取不相关的表

来自分类Dev

如何使用php脚本更新两个不相关的mysql表?

来自分类Dev

声明不相关的类,但不能正常运行

来自分类Dev

将类转换为不相关的接口

来自分类Dev

Liquibase尝试加载不相关的类

来自分类Dev

奇怪的角度绑定问题 - 更新不相关的组件

来自分类Dev

如何限制哪些类可以更改另一个不相关的类中的字段的值

来自分类Dev

用不相关的术语证明不相关的事物

来自分类Dev

如何找到不相关的未使用属性?

来自分类Dev

不相关时如何删除元素的内容?

来自分类Dev

如何使用c ++生成不相关的随机序列

来自分类Dev

如何防止从验证靶向不相关的ModelAttribute?

来自分类Dev

熊猫:如何最好地选择不相关的功能?

来自分类Dev

如何抓取新闻内容并删除不相关的部分

来自分类Dev

如何在SQL中检查多个不相关的条件?

来自分类Dev

如何控制不相关的Alteryx IO任务的执行顺序?

来自分类Dev

如何查找不相关的未使用属性?

来自分类Dev

我如何禁用不相关的XAML警告

来自分类Dev

如何在不相关的ViewModel中设置数据

来自分类Dev

如何编写附加不相关行的SQL查询?

来自分类Dev

Searchkick结果不相关

来自分类Dev

在Java中,如果它们的扩展名不相关,如何引用类的父级/兄弟级对象?

来自分类Dev

在Java中,如果它们的扩展名不相关,该如何引用类的父级/兄弟级对象?

来自分类Dev

使用不相关类的相关类的有效设计

来自分类Dev

当表彼此不相关时如何从另一个表中按顺序更新表列的值

Related 相关文章

  1. 1

    for循环重新分配完全不相关的变量

  2. 2

    nodejs,函数无缘无故跳到完全不相关的行?

  3. 3

    更改完全不相关的代码时,Visual Studio C ++编译器生成慢3倍的代码

  4. 4

    如何加快不相关数据的for循环?

  5. 5

    雄辩。如何获取不相关的表

  6. 6

    如何使用php脚本更新两个不相关的mysql表?

  7. 7

    声明不相关的类,但不能正常运行

  8. 8

    将类转换为不相关的接口

  9. 9

    Liquibase尝试加载不相关的类

  10. 10

    奇怪的角度绑定问题 - 更新不相关的组件

  11. 11

    如何限制哪些类可以更改另一个不相关的类中的字段的值

  12. 12

    用不相关的术语证明不相关的事物

  13. 13

    如何找到不相关的未使用属性?

  14. 14

    不相关时如何删除元素的内容?

  15. 15

    如何使用c ++生成不相关的随机序列

  16. 16

    如何防止从验证靶向不相关的ModelAttribute?

  17. 17

    熊猫:如何最好地选择不相关的功能?

  18. 18

    如何抓取新闻内容并删除不相关的部分

  19. 19

    如何在SQL中检查多个不相关的条件?

  20. 20

    如何控制不相关的Alteryx IO任务的执行顺序?

  21. 21

    如何查找不相关的未使用属性?

  22. 22

    我如何禁用不相关的XAML警告

  23. 23

    如何在不相关的ViewModel中设置数据

  24. 24

    如何编写附加不相关行的SQL查询?

  25. 25

    Searchkick结果不相关

  26. 26

    在Java中,如果它们的扩展名不相关,如何引用类的父级/兄弟级对象?

  27. 27

    在Java中,如果它们的扩展名不相关,该如何引用类的父级/兄弟级对象?

  28. 28

    使用不相关类的相关类的有效设计

  29. 29

    当表彼此不相关时如何从另一个表中按顺序更新表列的值

热门标签

归档