我有一个包含列表视图和文本视图的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());
}
}
}
我意识到如果我想从列表适配器中调用该方法,那么我需要使该方法可访问,但我不确定这样做的最佳方法。
答案 0 :(得分:1)
制作此方法public
或者您可以将activity
传递给适配器,通过该适配器可以找到按钮并更新文本,或者可以直接将Button
传递给适配器...
答案 1 :(得分:1)
我一直在寻找一种不涉及更改适配器代码的解决方案,因此适配器可以在其他情况下重复使用。
我使用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);
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();
}