【发布时间】:2015-01-05 23:04:30
【问题描述】:
我在这里有一个 ArrayAdapter 的实现,它负责填充一个显示多个视图的列表视图,其中包括一个搜索栏。 现在,我正在尝试为这些搜索栏实现 OnSeekBarChangeListener。我在搜索栏旁边有一个 TextView,显示当前进度。但是,每当用户移动搜索栏时,我都会遇到更新此 TextView 的问题。当调用 onProgessChanged 方法时,我不能只调用 competenceItem.currentValue.setText(progress),因为这样,competenceItem 对象就必须被声明为 final。现在,如果我要这样做,我的 else 子句将不再起作用,因为我显然无法为最终对象分配新值。
这里最好的做法是什么?
public View getView(int position, View convertView, ViewGroup parent){
View row = convertView;
CompetenceItem competenceItem = null;
if (row == null) {
...
competenceItem = new CompetenceItem();
competenceItem.seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
int progressChanged = 0;
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){
progressChanged = progress;
}
...
});
competenceItem.currentValue = (TextView) row.findViewById(R.id.textview_header_competence_current_value);
row.setTag(competenceItem);
} else {
competenceItem = (CompetenceItem) row.getTag();
}
//competenceItem gets filled with data here
return row;
}
static class CompetenceItem{
TextView title;
SeekBar seekbar;
TextView currentValue;
}
【问题讨论】:
-
让它成为您的 Activity 类成员,而不是本地最终变量
-
对同一个
competenceItem对象创建一个临时的final引用,然后在匿名类中使用它。
标签: java android inner-classes final android-seekbar