1

私のアプリには、ListView異なるタイムゾーンの時間を含む があります。を使用すると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

私は解決策を見つけました:

私のOnSeekBarChangeListener方法は今このようになります。

OnProgressChanged: ここで、オフセット変数の値を計算し、showwelt()関数を呼び出します

OnStartTrackingTouch: ここで、リストビューの現在のスクロール位置を保存します

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 に答える
0

アダプターで「今」を使用しているように見えるので、変更することはできません。シークバーの値をアダプターに取得し、「今」の代わりにそれを使用する方法を見つける必要があります。次に.invalidate()、リストの再描画を強制するために使用します。

于 2012-07-21T16:28:51.973 に答える