Обновите ArrayList <Task>, чтобы отразить изменения в базе данных - PullRequest
0 голосов
/ 12 февраля 2012

У меня есть ListView, в котором каждый элемент имеет SeekBar.

Когда я обновляю прогресс Seekbar, он записывается в базу данных, поэтому его можно перезагрузить при повторном использовании приложения.

К сожалению, если ListView прокручивается вверх или вниз, так что любой из элементов исчезает с видимого экрана, когда они перерисовываются, они рисуются со старым значением.

Как получить действие "обновить », когда SeekBar обновляется, так что значения в ListView синхронизируются с базой данных, это должно остановить перерисовку SeekBar с устаревшими данными.

Обновление:

Я решил, что это происходит из-за того, что базовый ArrayList не обновляется, поэтому, пока база данных записывается при обновлении прогресса, ArrayList находится в том же состоянии, в котором он был первоначально передан конструктору.Как мне заполнить ArrayList, когда я обновил базовую базу данных?

Код

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
try {
    if (view == null) {
    LayoutInflater vi = (LayoutInflater) mContext
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    view = vi.inflate(R.layout.task_list_item, null);
    }
    final Task t = mList.get(position);
    if (t != null) {

    /* assign layout elements */
    final SeekBar seekBar = (SeekBar) view.findViewById(R.id.seek);
    final TextView textViewDescription = (TextView) view
        .findViewById(R.id.task_description_text_view);
    final TextView textViewTaskId = (TextView) view
        .findViewById(fyp.proj.R.id.task_id_text_view);
    final TextView textViewTaskTitle = (TextView) view
        .findViewById(R.id.task_title_text_view);

    /* populate layout with task details */
    textViewTaskId.setText(String.valueOf(t.getTaskId()));
    textViewTaskTitle.setText(t.getTaskTitle());
    textViewDescription.setText(t.getTaskDesc());
    seekBar.setProgress(t.getProgress());
    seekBar.setTag(t.getTaskId());

    /* attach listener */
    attachProgressUpdatedListener(seekBar);

    }
} catch (Exception e) {
    Log.i(TaskAdapter.class.toString(), Log.getStackTraceString(e));
}
return view;
}

private void attachProgressUpdatedListener(SeekBar seekBar) {
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

    public void onStopTrackingTouch(SeekBar seekBar) {
    int progress = seekBar.getProgress();
    int task_id = (Integer) seekBar.getTag();

    // task handler instansiated with zero as parent project id is
    // not needed here.
    TaskHandler taskHandler = new TaskHandler(DBAdapter
        .getDBAdapterInstance(getContext()), 0);

    taskHandler.updateTaskProgress(task_id, progress);

    }

    public void onStartTrackingTouch(SeekBar seekBar) {
    // empty as onStartTrackingTouch listener not being used in
    // current implementation

    }

    public void onProgressChanged(SeekBar seekBar, int progress,
        boolean fromUser) {
    // empty as onProgressChanged listener not being used in
    // current implementation

    }
});

}

1 Ответ

1 голос
/ 18 февраля 2012

Решение

Согласно комментарию Слукиана, ответом в этом случае было передать новое значение прогресса обратно в базовый млист.Вот решение.

private void attachProgressUpdatedListener(SeekBar seekBar,
    final int position) {

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

    public void onStopTrackingTouch(SeekBar seekBar) {
    int progress = seekBar.getProgress();
    int task_id = (Integer) seekBar.getTag();

    // task handler instansiated with zero as parent project id is
    // not needed here.
    TaskHandler taskHandler = new TaskHandler(DBAdapter
        .getDBAdapterInstance(getContext()), 0);

    taskHandler.updateTaskProgress(task_id, progress);

    // update underlying mList
    mList.get(position).setProgress(progress);

    }

    public void onStartTrackingTouch(SeekBar seekBar) {
    // empty as onStartTrackingTouch listener not being used in
    // current implementation

    }

    public void onProgressChanged(SeekBar seekBar, int progress,
        boolean fromUser) {
    // empty as onProgressChanged listener not being used in
    // current implementation

    }
});

}

Добавлена ​​позиция в метод attachProgressUpdatedListener.Получил элемент в ArrayList в переданной позиции и обновил атрибут прогресса.

...