我有一个ListView
,它将托管名为TaskView
的复合视图,它是Task
的直观表示。后台工作在AsyncTask
中完成,TaskView
的子项(两个TextView
和一个ProgressView
)在onProgressUpdate()
中更新。在我完成更新视图后,我调用了listView.invalidateViews()
,我相信假设重绘其所有子视图。但是,情况并非如此,因为没有一个观点发生变化。在设置了一些断点并观察各种视图的值之后,我确定他们做更改了,但他们的新值并没有反映在屏幕上
以下是我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());
}
答案 0 :(得分:3)
要使用新数据刷新列表视图,请调用分配给列表视图的适配器的notifyDataSetChanged()
方法。
答案 1 :(得分:0)
对每个已更改的视图使用invalidate()
方法。
另一个技巧是:
更新传递给适配器的数组列表对象,例如,如果要更新的视图位于我执行此操作的位置:
list.remove(i);
list.add(i, new object()); // the new object must have the updated content
adapter.notifyDataSetChange();
更新
让我再次告诉你这个问题: 你有一个带有taskview对象的列表(每行对应一个taskview) 在每一行中,您都有一个编程栏和2个文本视图 你想更新一些行
解决方案:
protected void onProgressUpdate(Event... values) {
Task task = view.getTask();
task.setProgress() // first change the content of taskView data
task.setStatus()
task.setSecondaryStatus()
// now let the adapter do update the rows
adapter.notifyDataSetChange() // if it dose not work remove task and add to list and then again call notify
}
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater =
(LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.list_item, parent, false);
Task task = getItem(position);
TextView status = view.findViewById();
status.setText(task.getStatus());
Progressbar pb = view.findViewById();
//....
TextView secondaryStatus = view.findViewById();
secondaryStatus.setText(task.getSecondaryStatus());
return view;
}