【发布时间】:2016-01-25 11:44:56
【问题描述】:
我有一个 ListView,每行都有一个 SeekBar。列表的大小,因此 SeekBar 的数量会有所不同。
我设置了一个 SeekBar.OnSeekBarChangeListener,然后我根据 SeekBar 显示的整数更新一个 TextView。
问题是列表中只有最后一个 SeekBar 似乎是从 SeekBar.OnSeekBarChangeListener 更新的。
我怎样才能使所有的 SeekBars 工作?
提前致谢。
private class MySimpleArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private final ArrayList<?> list;
public MySimpleArrayAdapter(Context context, ArrayList<?> list) {
super(context, R.layout.monitoringrowlayout);
Log.e(TAG, "inside adapter constructor");
this.context = context;
this.list = list;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.monitoringrowlayout, parent, false);
final int pos = position;
Log.e(TAG, "list size in adapter = " + list.size());
String record = list.get(position).toString();
rowView.setTag(record);
String[] itemsInRecord = record.split(",");
Log.e(TAG, "itemin record = " + itemsInRecord.length);
String[] recordItem = new String[itemsInRecord.length];
for (int x = 0; x < itemsInRecord.length; x++) {
recordItem[x] = itemsInRecord[x];
Log.e(TAG, "recordItem[x]" + x + " " +recordItem[x] );
}
recordItem[0] = recordItem[0].replace('[', ' ').trim();
recordItem[3] = recordItem[3].replace(']', ' ').trim();
TextView description = (TextView) rowView.findViewById(R.id.rowmonitoringdescription);
description.setText(recordItem[1]);
rating = (TextView) rowView.findViewById(R.id.rowmonitoringrating);
sb = (SeekBar)rowView.findViewById(R.id.seekbarmonitoring);
sb.setOnSeekBarChangeListener(customSeekBarListener);
return rowView;
}
@Override
public int getCount() {
return this.list.size();
}
}// end of adapter class
private SeekBar.OnSeekBarChangeListener customSeekBarListener = new SeekBar.OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
upDateTextBox(progress);
}
};
private void upDateTextBox(int progress){
rating.setText(String.valueOf(progress));
}
【问题讨论】:
-
显然是因为您在
getView中设置了rating(用于upDateTextBox)的var ...所以rating将始终是上次getView调用中的TextView...显然你必须将搜索栏与 textview 连接起来......常见的方法是使用 setTag 作为搜索栏和 TextView 参考 -
"只有列表中的最后一个 SeekBar 似乎是从 SeekBar.OnSeekBarChangeListener 更新的" -- 请准确解释这意味着什么。如果您的意思是只有一个
rating正在更新,那就是 Selvin 所指的。 -
...此代码还有另一个问题... AdapterView 正在重用项目的视图...使用此类代码,您将无法在将项目滚动出可见项目并返回后获得正确的值
标签: android android-arrayadapter android-seekbar