【发布时间】:2016-07-28 12:39:49
【问题描述】:
我有一个带有自定义适配器的 ListView,每一行都包含一个用户可以设置的搜索栏。每个 seekbar 都有一个 seekBarChangeListener 设置在适配器中,当用户更改 ListView 中 seekbar 的值时,适配器的 arraylist 会更新。这是我在适配器的getView() 中得到的:
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
final ViewHolder viewHolder;
View v = convertView;
if(v == null){
v = inflater.inflate(R.layout.row, null);
viewHolder = new ViewHolder();
viewHolder.contentView = (TextView) v.findViewById(R.id.pref_content);
viewHolder.sliderView = (SeekBar) v.findViewById(R.id.pref_slider);
v.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) v.getTag();
}
// Get initial values
Prompt p = promptList.get(position);
String content = p.getContent();
int sliderLevel = p.sliderLevel();
// Set views with initial values
viewHolder.contentView.setText(content);
viewHolder.sliderView.setMax(noOfLevels);
viewHolder.sliderView.setProgress(sliderLevel);
// Set Change Listener for Seekbar
viewHolder.sliderView.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// Set new level of the Slider in the Array List
promptList.get(position).setSliderLevel(progress);
}
});
return v;
}
因此,当用户更改搜索栏的值时,ChangeListener 从 ArrayList 获取对象并设置其新的 sliderLevel 值。但是,如果我在 ListView 中设置了一个新值,然后再次向下滚动,以便再次调用 getView,则即使我更改了 arrayList 中的值,seekbar 也会返回到它的初始值。
有人可以帮我看看我哪里出错了吗?谢谢
【问题讨论】:
-
你应该创建一个单独的列表来保存每个seekbar的值,并在getView方法中设置为对应的值。 Listview 回收视图
-
ListView 回收视图,但适配器始终保持相同的 ArrayList。当视图被回收时,再次调用getView(),访问的是同一个ArrayList。因此,如果我更改 ArrayList,一旦再次调用 getView(),它应该会显示新值。
-
是的,你是对的,这很奇怪
-
我会尝试添加对
viewHolder.sliderView.setMax(..)的调用
标签: android listview arraylist