我有一个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;
}
}
答案 0 :(得分:1)
我已经修改了ArrayAdapter的源代码,并且在它调用onChanged()
的观察者之后我看不到执行代码的方法所以我的答案是:
onChanged()
被称为ListView.setAdapter
P.S。 1号是最佳解决方案,但2号是简单的解决方案,根据您的时间和性能要求使用您所需要的,但我建议花一些时间并实施1号。
答案 1 :(得分:0)
我认为您的MainActivity.setTextViewValue("Something...");
行正在尝试从适配器打印一些数据并且您获得旧值,是这样吗?
我不是100%肯定这一点,也许其他人可以帮忙确认一下,但我认为notifyDataSetChanged()
只是将适配器上的当前数据标记为脏,所以适配器会知道它有刷新数据,但在您拨打电话时不会立即执行此操作。
编辑: 如果我的第一段是正确的,您应该尝试使用数据源中的数据而不是适配器更新文本视图,这将是解决问题的更好方法