我有一个 ListView
,它将托管名为 TaskView
的复合 View ,它是 Task
的可视化表示。后台工作在 AsyncTask
和 TaskView
的子级(两个 TextView
和一个 ProgressView
)中完成在 onProgressUpdate()
中更新。更新完 View 后,我调用 listView.invalidateViews()
,我相信它应该重绘其所有 subview 。然而,事实并非如此,因为任何观点都没有改变。设置一些断点并观察各个 View 的值后,我确定它们确实发生了变化,但它们的新值没有反射(reflect)在屏幕上
这是我的 AsyncTask
的概述(注意:类和方法名称已被简化)
private TaskView view;
public Monitor(TaskView view) {
this.view = view;
}
protected Void doInBackground(Void... params) {
// <set up a handler to push events to onProgressUpdate()>
// <do work>
return null;
}
protected void onProgressUpdate(Event... values) {
Task task = view.getTask();
// <update task based on the Event>
view.update(); // Tells view to update its TextViews and ProgressBar
// based on task's values
listView.invalidateViews(); // Refresh ListView views?
}
如何让 ListView
重绘其子项?
根据要求,这里是TaskAdapter.getView()
public View getView(int position, View convertView, ViewGroup parent) {
Task task = getItem(position);
TaskView view = (TaskView) convertView;
if (view == null) {
// Instantiates a TaskView and sets the Task
view = TaskView.newInstance(getContext(), task);
}
return view;
}
和TaskView.update()
public void update() {
// https://github.com/Todd-Davies/ProgressWheel
progressWheel.setProgress(task.getProgress());
if (task.isIndeterminate()) {
progressWheel.spin();
} else {
progressWheel.stopSpinning();
}
// status and secondaryStatus are TextViews
status.setText(task.getStatus());
secondaryStatus.setText(task.getSecondaryStatus());
}
最佳答案
要使用新数据刷新 ListView ,请调用分配给 ListView 的适配器的 notifyDataSetChanged()
方法。
关于java - 更新 ListView 中 View 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25129695/