在ListView中更新视图的内容

时间:2014-08-05 00:49:35

标签: java android listview android-view

我有一个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());
}

2 个答案:

答案 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;
 }