更新ListView而不更改数据

时间:2012-07-21 16:14:58

标签: android listview listadapter

在我的应用中,我有ListView,其中包含不同时区的时间。使用seekbar,用户可以更改时区的当前时间,其他区域也可以更新时间。

在我的onCreate()方法中,我将ListViewOnSeekBarChangeListener相关联,并将时间变量设置为我之前选择的位置的当前时间。另外,我将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}}之前,我尝试清除适配器并再次添加所有项目。 我尝试保存列表的当前滚动位置并将其恢复。

我该如何解决我的问题?

2 个答案:

答案 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);
}