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