Не отображается ListView при загрузке android приложения

Всем привет! Я только начинаю знакомиться с разработкой под андройд и решил написать простой парсер валют. Мне нужно, чтобы при загрузке приложения список валют сразу отображался на экране. Вот MainActivity.class

public class MainActivity extends AppCompatActivity {
    private static final String uri = "https://www.cbr-xml-daily.ru/daily_json.js";
    private Thread secThread;
    private Runnable runnable;
    private JsonParser jsonParser;
    private List<CurrencyItem> currencyItems;
    private ListView listView;
    private CurrencyAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        currencyItems = new ArrayList<>();

        init();

        adapter = new CurrencyAdapter(this, R.layout.currency_item, currencyItems, getLayoutInflater());
        listView = findViewById(R.id.listView);
        listView.setAdapter(adapter);
    }

    private void init() {
        runnable = () -> {
            jsonParser = new JsonParser();
            currencyItems = jsonParser.getAllCurrencies(uri);
            Log.d("MyLog", currencyItems.toString());

            runOnUiThread(() -> adapter.notifyDataSetChanged());
        };
        secThread = new Thread(runnable);
        secThread.start();
    }
}

Если я не скачиваю данные с сайта, а добавляю их вручную в ArrayList то все отображается(мой адаптер вроде как работает:)). Как мне правильно синхронизировать скачивание данных и их отображение в ListView при запуске приложения?

JsonParser.class

public class JsonParser {
public List<CurrencyItem> getAllCurrencies(String uri){
    Map<String, CurrencyItem> currencyItemMap = new HashMap<>();

    try{
        URL url = new URL(uri);
        InputStreamReader reader = new InputStreamReader(url.openStream());

        Gson gson = new Gson();
        JsonObject jsonObject = gson.fromJson(reader, JsonObject.class);
        JsonObject valute = jsonObject.getAsJsonObject("Valute");
        currencyItemMap = gson.fromJson(valute, new TypeToken<Map<String, CurrencyItem>>(){}.getType());
    } catch (IOException e){
        e.getCause();
    }
    List<CurrencyItem> currencies = new ArrayList<>(currencyItemMap.values());

    return currencies;
}

}


Ответы (2 шт):

Автор решения: woesss

Вы не обновляете список в адаптере.

currencyItems = jsonParser.getAllCurrencies(uri); - здесь вы присваиваете полученный список переменной в активности, что никак не влияет на список в адаптере.
Лучше всего делегировать обновление самому адаптеру:

            jsonParser = new JsonParser();
            currencyItems = jsonParser.getAllCurrencies(uri);
            Log.d("MyLog", currencyItems.toString());

            runOnUiThread(() -> adapter.update(currencyItems));

В адаптере:

public void update(List<CurrencyItem> currencyItems) {
    // допустим items - это поле в котором хранится список адаптера
    items.clear();
    items.addAll(currencyItems);
    notifyDataSetChanged();
}
→ Ссылка
Автор решения: Eugene Zaychenko

Вы создаете currencyItems передаете его в адаптер. После чего получаете данные и метод jsonParser.getAllCurrencies(uri) - возвращает вам НОВЫЙ список который вы перезаписываете в поле currencyItems. Получается у вас в адаптере один список, а в активити другой (у них разные адреса в памяти).

Сделайте метод update в адаптере в него предавайте новый список.

Другой вариант, после получения списка из парсера чистить currencyItems и через addAll() добавить новый список (из парсера)

→ Ссылка