notifyDataSetChanged()最后更新

时间:2014-03-22 21:48:28

标签: android multithreading adapter runnable notifydatasetchanged

我有一个Runnable类来计算我的复合列表视图的模型值,因为在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;
    }
}

2 个答案:

答案 0 :(得分:1)

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

  1. 即使在onChanged()被称为
  2. 的情况下实施自己的
  3. 使用带有新数据集的全新适配器呼叫ListView.setAdapter
  4. P.S。 1号是最佳解决方案,但2号是简单的解决方案,根据您的时间和性能要求使用您所需要的,但我建议花一些时间并实施1号。

答案 1 :(得分:0)

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

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

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