在我的应用中,我有ListView
,其中包含不同时区的时间。使用seekbar
,用户可以更改时区的当前时间,其他区域也可以更新时间。
在我的onCreate()
方法中,我将ListView
与OnSeekBarChangeListener
相关联,并将时间变量设置为我之前选择的位置的当前时间。另外,我将seekbar
设置为private ArrayList<Welt> welts;
private SimpleArrayAdapter arrayAdapter;
public void onCreate(Bundle savedInstanceState) {
...
arrayAdapter = new SimpleArrayAdapter(this, R.layout.listwelt, welts);
showwelt();
...
now.setToNow();
now.set(now.toMillis(false));
pos = extras.getInt("weltcompare");
now.switchTimezone(welts.get(pos).zone);
...
seek.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
offset = seekBar.getProgress()*5 - start;
arrayAdapter.notifyDataSetChanged();
//showwelt();
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
offset = seekBar.getProgress()*5 - start;
arrayAdapter.notifyDataSetChanged();
//showwelt();
}
});
...
}
public void showwelt() {
ListView listTest = (ListView)findViewById(R.id.mylistwelt);
listTest.setAdapter(arrayAdapter);
listTest.setDivider(null);
listTest.setDividerHeight(0);
}
。
public class SimpleArrayAdapter extends ArrayAdapter<Welt> {
private final int resource;
public SimpleArrayAdapter(Context context, int resource, ArrayList<Welt> arrays) {
super(context, resource, arrays);
this.resource = resource;
}
public View getView(int position, View convertView, ViewGroup parent) {
Welt cobject = getItem(position);
RelativeLayout listView;
if(convertView==null) {
listView = new RelativeLayout(getContext());
String inflater = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater vi;
vi = (LayoutInflater)getContext().getSystemService(inflater);
vi.inflate(resource, listView, true);
}else{
listView = (RelativeLayout) convertView;
}
TextView tv1 = (TextView)listView.findViewById(R.id.listwelt1);
tv1.setText(cobject.ort);
TextView tv2 = (TextView)listView.findViewById(R.id.listwelt2);
tv2.setText(cobject.land);
TextView tv3 = (TextView)listView.findViewById(R.id.listwelt3);
now.set(base);
now.minute = now.minute + offset;
now.normalize(false);
now.set(now.toMillis(false));
now.switchTimezone(cobject.zone);
tv3.setText(TimeMateActivity.formatDateTime(0, 0, 0, now.hour, now.minute));
TextView tv4 = (TextView)listView.findViewById(R.id.listwelt4);
tv4.setText(TimeMateActivity.formatDateTime(now.monthDay, now.month, now.year, 24, 0));
if(position == pos) {
tv1.setTypeface(null, Typeface.BOLD);
tv2.setTypeface(null, Typeface.BOLD);
tv3.setTypeface(null, Typeface.BOLD);
}
return listView;
}
}
最后我的ArrayAdapter类:
arrayAdapter.notifyDataSetChanged()
因此,在活动运行时更改的唯一数据是变量偏移量。
我认为这就是OnSeekBarChangeListener
无效的原因,而ListView
中的showwelt()可以完成工作,但会将notifyDataSetChanged()
重置为顶部。
我读了几篇文章,但没有一篇文章有所帮助。 在调用{{1}}之前,我尝试清除适配器并再次添加所有项目。 我尝试保存列表的当前滚动位置并将其恢复。
我该如何解决我的问题?
答案 0 :(得分:0)
在我看来,你在适配器中使用“now”,所以你永远无法改变它。您需要找到一种方法将seekbar值放入适配器并使用它而不是“now”。然后使用.invalidate()
强制重绘列表。
答案 1 :(得分:0)
我找到了解决方案:
我的OnSeekBarChangeListener
方法现在看起来像这样。
OnProgressChanged
:在这里我计算偏移量变量的值并调用showwelt()
函数
OnStartTrackingTouch
:这里我保存了listview的当前滚动位置
OnStopTrackingTouch
:空
我的showwelt
函数看起来像这样:
public void showwelt() {
ListView listTest = (ListView)findViewById(R.id.mylistwelt);
SimpleArrayAdapter arrayAdapter = new SimpleArrayAdapter(this, R.layout.listwelt, welts);
listTest.setAdapter(arrayAdapter);
listTest.setDivider(null);
listTest.setDividerHeight(0);
listTest.setSelectionFromTop(index, top);
}