Не отображается 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 шт):
Вы не обновляете список в адаптере.
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();
}
Вы создаете currencyItems передаете его в адаптер. После чего получаете данные и метод jsonParser.getAllCurrencies(uri) - возвращает вам НОВЫЙ список который вы перезаписываете в поле currencyItems. Получается у вас в адаптере один список, а в активити другой (у них разные адреса в памяти).
Сделайте метод update в адаптере в него предавайте новый список.
Другой вариант, после получения списка из парсера чистить currencyItems и через addAll() добавить новый список (из парсера)