0

締め切りが関連付けられているユーザー タスク/To-Do のリストがあります。TextViewこれらのタスクの残り時間を示すを毎分更新します。

私が抱えている問題は、テキストビューが更新されると、間違った残り時間が表示されることがあります。特に、上下にスクロールすると、別のタスクの残り時間がその場所に表示されます。

これは、リスト内のビューがリサイクルされていることと関係があり、不遜な (画面外の) ビューがまだロジックを処理していることを知っています。Runnableバグを自分のクラスに絞り込みtaskTime、間違ったビューに関連付けられている場合があります。

taskTimeどうすれば正しいもので正しいものを維持できるかわかりませんview。何か提案はありますか?

postDelayed()ps表示されなくなった for ビューをすべてクリーンアップするにはどうすればよいですか?

MyCursorTreeAdapter.class

@Override
protected void bindChildView(View view, Context context, Cursor cursor, boolean isLastChild) {
    ViewHolder viewHolder = (ViewHolder) view.getTag();
    long taskTime = cursor.getLong(cursor.getColumnIndexOrThrow(TableTask.COLUMN_TIME));
    viewHolder.timeLeftTextView.setText(TimeUtils.getFormatedTimeLeft(taskTime));

    Runnable updateTimeRemainingRunnable = new UpdateTimeRemainingRunnable(view, taskTime);
    long postDelay = TimeUtils.millisecondsUntilNextMinute();
    view.postDelayed(updateTimeRemainingRunnable, postDelay);
}

private static class UpdateTimeRemainingRunnable implements Runnable {
    private final WeakReference<View> weakViewRef;
    private final long taskTime;

    protected UpdateTimeRemainingRunnable(View view, long taskTime) {
        weakViewRef = new WeakReference<>(view);
        this.taskTime = taskTime;
    }

    @Override
    public void run() {
        final View view = weakViewRef.get();
        if (view == null) return;

        ViewHolder viewHolder = (ViewHolder) view.getTag();
        view.getTag();

        // Task time is wrong here -- I sometimes get another task's task time

        String formatedTime = TimeUtils.getFormatedTimeLeft(taskTime);
        viewHolder.timeLeftTextView.setText(formatedTime);

        long postDelay = TimeUtils.millisecondsUntilNextSecond();
        view.postDelayed(this, postDelay);
    }
}
4

1 に答える 1

0

直接的な方法、

view.setTag(resouce_id,runnable) を使用して、ランナブルとビューを一緒にバインドします。

getChildView の場合、最初に view.getTag(resouce_id) を確認し、null でない場合は view.removeCallbacks() を使用してクリアし、新しい Runnable を再バインドします。

リストビューは、スクロール時にリサイクルされたアイテムを使用します... .

しかし、これは最適な解決策ではありません。

于 2015-02-28T06:59:03.513 に答える