Обобщенно. В фрагменте есть 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);
}
}
}
данную часть кода адаптера проверял логами, проблемы не нашел, где-то они кэшируются самим адаптером.
Ваша проблема в том, что взятие 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, который берет на себя "подкапотную" работу с обновлением курсора.
Краткая инструкция здесь
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники