締め切りが関連付けられているユーザー タスク/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);
}
}