如何更新存储列表值平均值的TextView

时间:2012-03-02 18:23:16

标签: android design-patterns observer-pattern

我有一个包含列表视图和文本视图的Android活动。 “文本”视图显示有关列表视图的总计内容的信息,如果列表视图中的项目已更新,则“文本视图”需要反映更改。

类似于观察者模式,但有一个组件反映了许多变化,而不是反过来。

任务在列表视图中显示为项目,可以使用搜索栏更新进度以设置新的进度级别。

以下方法填充TextView,因此我需要从SeekBar onStopTrackingProgress Listener中再次调用它。

private void populateOverviewText() {
TextView overview = (TextView) findViewById(R.id.TaskOverview);

if (!taskArrayList.isEmpty()) {

    int completion = 0;
    try {
    completion = taskHandler.getProjectCompletion();
    overview.setText("Project Completion = " + completion);
    } catch (ProjectManagementException e) {
    Log.d("Exception getting Tasks List from project",
        e.getMessage());
    }
}

}

我意识到如果我想从列表适配器中调用该方法,那么我需要使该方法可访问,但我不确定这样做的最佳方法。

2 个答案:

答案 0 :(得分:1)

制作此方法public

或者您可以将activity传递给适配器,通过该适配器可以找到按钮并更新文本,或者可以直接将Button传递给适配器...

答案 1 :(得分:1)

使用DataSetObserver

我一直在寻找一种不涉及更改适配器代码的解决方案,因此适配器可以在其他情况下重复使用。

我使用DataSetObserver

实现了这一点

创建Observer的代码非常直接,我只是添加一个对onChanged()方法中更新TextView的方法的调用。

附加观察者(添加到活动显示列表)

    final TaskAdapter taskAdapter = new TaskAdapter(this, R.id.list, taskArrayList);

    /* Observer */
    final DataSetObserver observer = new DataSetObserver() {
        @Override
        public void onChanged() {
            populateOverviewText();
        }
    };

    taskAdapter.registerDataSetObserver(observer);

触发OnChanged方法(添加到适配器内的SeekBar侦听器)

    public void onStopTrackingTouch(SeekBar seekBar) {
    int progress = seekBar.getProgress();
    int task_id = (Integer) seekBar.getTag();

    TaskHandler taskHandler = new TaskHandler(DBAdapter
        .getDBAdapterInstance(getContext()));

    taskHandler.updateTaskProgress(task_id, progress);

    mList.get(position).setProgress(progress);


    //need to fire an update to the activity
    notifyDataSetChanged();

    }