Проблема с “подкапотными” процессами SimpleCursorAdapter-а

265
16 ноября 2017, 02:17

Обобщенно. В фрагменте есть ListView, к нему подключен кастомный адаптер extends SimpleCursorAdapter. Проблема заключается в неизвестном процессе происходящем "под капотом" адаптера, делающий работу интерфейса в определенной ситуации некорректной.

Суть. При добавлении пользователем нового города, в БД сначала добавляется текст "Идет загрузка..." для заглушки, одновременно с этим происходит запрос данных с сервера:

... при получении которых заглушка меняется на эти данные:

... на данном этапе, все хорошо. Далее удаляю любой из пунктов и добавляю что-нибудь новое, и по неизвестной мне причине, теперь к заглушке "о загрузке" добавляются иконка и информация от предыдущего удаленного пункта:

...после получения погодных данных с сервера все норм:

Код кастомного адаптера:

import android.content.Context;
import android.database.Cursor;
import android.view.View;
import android.widget.ImageView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import ru.igorsharov.weatherapp.DataHandler.DataWeatherHandler;
import ru.igorsharov.weatherapp.R;

public class CustomSimpleAdapter extends SimpleCursorAdapter {
    private String[] from;
    public CustomSimpleAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
        super(context, layout, c, from, to, flags);
        this.from = from;
    }
    private String getCurrentColumn(Cursor cursor, String from) {
        return cursor.getString(cursor.getColumnIndexOrThrow(from));
    }
    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        final String[] mFrom = from;
        String cityName = getCurrentColumn(cursor, mFrom[0]);
        TextView tvCity = view.findViewById(R.id.tvCityName);
        setViewText(tvCity, cityName);

        String temperature = getCurrentColumn(cursor, mFrom[1]);
        if (temperature != null) {
            TextView tvTemperature = view.findViewById(R.id.tvTemperature);
            tvTemperature.setVisibility(View.VISIBLE);
            tvTemperature.setTextColor(DataWeatherHandler.colorOfTemp(context, temperature));
            tvTemperature.setText(DataWeatherHandler.addDegree(temperature));
        }
        String idIconWeatherToday = getCurrentColumn(cursor, mFrom[2]);
        if (idIconWeatherToday != null) {
            ImageView imgView = view.findViewById(R.id.imageView);
            // достаем путь к ресурсу для иконки
            String iconStr = String.valueOf(DataWeatherHandler.getIconId(idIconWeatherToday));
            imgView.setVisibility(View.VISIBLE);
            setViewImage(imgView, iconStr);
        }
    }
}

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

Answer 1

Ваша проблема в том, что взятие Cursorа должно происходить асинхронно, то есть вне UI треда. Как пишут об этом умные люди:

Prior to Honeycomb, it was difficult to manage cursors, synchronize correctly with the UI thread, and ensure all queries occurred on a background thread. Android 3.0 introduced the Loader and LoaderManager classes to help simplify the process. Both classes are available for use in the Android Support Library, which supports all Android platforms back to Android 1.6.

Вам надо использовать LoaderManager, который берет на себя "подкапотную" работу с обновлением курсора.

Краткая инструкция здесь

READ ALSO
Копирование ArrayList во внешнее хранилище

Копирование ArrayList во внешнее хранилище

Как можно копировать ArrayList в внешнее хранилище, чтобы это было доступно пользователю

222
Потоки и Thread.sleep()

Потоки и Thread.sleep()

Пытаюсь написать планировщикНеобходимо чтобы два потока (функции LoopGetTask и LoopExecTask) выполнялись параллельно, но Thread

306
Нужна помощь с потоками C#

Нужна помощь с потоками C#

Передо мной появилась такая задача: Создается n потоков, в каждый поток передается значение string, и в каждом потоке оно сравнивается в условии...

261
Заливка окружности цветом

Заливка окружности цветом

Как залить окружность тем цветом, который нужен именно мне? Есть форма, в которой пользователь выбирает цвет, и нужно этим цветом закрасить...

310