0

我有一个Runnable类可以为我的复合列表视图计算模型值,在该可运行文件中,自定义线程中有一个 UI 线程。我有适配器的notifyDataSetChanged()调用,但是在notifyDataSetChanged()我尝试更新主布局中的一些 TextView 值之后。问题是在运行 TextView 时首先更新,然后才是 ListViews 并更新。这意味着notifyDataSetChanged()Adapter定义类最后更新,这不适合我。是否有可能同步这些屏幕更新?

这是示例代码:

public class TestRunnable implements Runnable {
    private TestAdapter adapter;

    @Override
    public void run() {
        Context.runOnUiThread(new Runnable() {
            @Override
            public void run() {

                adapter.notifyDataSetChanged();

                MainActivity.setTextViewValue("Something...");
            }
        });
    }
}

public class TestAdapter extends ArrayAdapter<TestModel> {
    @Override
    public View getView(final int position, View view, ViewGroup parent) {
        View row = view;
        TestHolder holder;
        Boolean rowIsNew = false;
        if (row == null) {
            rowIsNew = true;
            LayoutInflater layoutInflater = ((Activity) context)
                    .getLayoutInflater();
            row = layoutInflater.inflate(layoutResourceId, parent, false);

            holder = new TestHolder();
            ...
            row.setTag(holder);
        } else {
            holder = (TestHolder) row.getTag();
        }

        TestModel testModel = data.get(position);
        holder.property = testModel.property;
        ...

        if (rowIsNew) {
            holder.....setTypeface(...);
            holder.....setTypeface(...);

        }

        return row;
    }
}
4

2 回答 2

1

我已经修改了 ArrayAdapter 的源代码,并且在它调用了它的观察者之后我看不到执行代码的方法,onChanged()所以我的答案是:

  1. onChanged()即使在被调用时也可以实现自己的
  2. ListView.setAdapter使用带有新数据集的全新适配器调用

PS 数字 1 是最佳解决方案,但数字 2 是简单的解决方案,具体取决于您的时间和性能要求,使用您需要的东西,但我建议花一些时间并实施数字 1。

于 2014-03-22T22:39:14.523 回答
0

我认为您的MainActivity.setTextViewValue("Something...");线路正在尝试从适配器打印一些数据并且您正在获得旧值,是这样吗?

我不是 100% 确定这一点,也许其他人可以帮助确认这一点,但我认为notifyDataSetChanged()只将适配器上的当前数据标记为脏,所以适配器会知道它必须刷新数据,但它不会拨打电话时立即执行。

编辑:如果我的第一段是正确的,您应该尝试使用来自数据源而不是适配器的数据来更新文本视图,这将是解决问题的更好方法。

于 2014-03-22T22:14:00.837 回答