1

在我的应用程序中,我有一个ListView包含不同时区的时间。使用 a seekbar,用户可以更改时区的当前时间,并且其他时区也应该更新它们的时间。

在我的onCreate()方法中,我ListView启动了 Time 变量并将其设置为我之前选择的位置的当前时间。另外我设置了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);
}

最后我的 ArrayAdapter 类:

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.notifyDataSetChanged()不工作的原因,虽然在工作中调用 showwelt() OnSeekBarChangeListener,但将其重置ListView为顶部。

我读了几篇文章,但没有一个有帮助。我试图在调用之前清除适配器并再次添加所有项目notifyDataSetChanged()。我尝试保存列表的当前滚动位置并恢复它。

我应该如何解决我的问题?

4

2 回答 2

0

在我看来,您在适配器中使用“现在”,因此您永远无法更改它。您需要找到一种方法将搜索栏值放入适配器并使用它而不是“现在”。然后使用.invalidate()强制重绘列表。

于 2012-07-21T16:28:51.973 回答
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);
}
于 2012-07-22T10:46:25.897 回答