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

Android 如何更新存储平均列表值的TextView,android,design-patterns,observer-pattern,Android,Design Patterns,Observer Pattern,我有一个由列表视图和文本视图组成的android活动。文本视图显示有关列表视图的汇总内容的信息,如果列表视图中的项目已更新,则文本视图需要反映更改 有点像一个观察者模式,但一个组件反映了许多方面的变化,而不是相反 任务在列表视图中显示为项目,可以使用seekbar设置新的进度级别来更新进度 下面的方法填充TextView,因此我需要从SeekBar onStopTrackingProgress侦听器内部再次调用它 private void populateOverviewText() { Tex

我有一个由列表视图和文本视图组成的android活动。文本视图显示有关列表视图的汇总内容的信息,如果列表视图中的项目已更新,则文本视图需要反映更改

有点像一个观察者模式,但一个组件反映了许多方面的变化,而不是相反

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

下面的方法填充TextView,因此我需要从SeekBar onStopTrackingProgress侦听器内部再次调用它

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());
    }
}

}

我意识到如果我想从列表适配器调用该方法,那么我需要使该方法可访问,但我不确定执行此操作的最佳方法。

或者将此方法
公开

或者您可以将
活动
传递给适配器,通过该适配器您可以找到按钮并更新文本,或者可以使用DataSetObserver直接将
按钮
传递给适配器…

我正在寻找一种不涉及修改适配器代码的解决方案,这样适配器就可以在其他情况下重用

我使用DataSetObserver实现了这一点

创建观察者的代码非常简单,我只需在onChanged()方法中添加一个对更新TextView的方法的调用

附加观察者(添加到活动显示列表) 触发OnChanged方法(添加到适配器内的SeekBar侦听器)
如何将活动传递给适配器,例如taskListView.setAdapter(新的TaskAdapter(this,R.id.list,taskaraylist,getActivity());然后将ACTIVITY设置为适配器的局部变量?这似乎将任务适配器单独耦合到此活动,我在多个活动中使用相同的任务适配器。所以这不是最适合这里的。按钮也一样。您说过
如果我想从列表适配器调用该方法
,如果您想从列表适配器调用它,您可以使用我在回答中描述的逻辑调用它/更新文本视图..(您必须如何在diff activities中管理它是diff的事情,每次您都要传递diff activity上下文)我认为应该有比简单地将活动传递给适配器更好的方法,比如注册一个监听器来查看项目是否更改,以及它们是否确实更改,然后启动更新textview的方法。当然,您可以传递(单击/onStopTrackingProgress/etc)监听器(来自活动)到适配器,然后将其绑定到seekbar或所需的任何按钮。。。这样,你的逻辑就会保持活跃。。侦听器只是绑定到listadapter中所需的任何项。。。
    final TaskAdapter taskAdapter = new TaskAdapter(this, R.id.list, taskArrayList);

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

    taskAdapter.registerDataSetObserver(observer);
    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();

    }