Проверьте репозиторий https://github.com/vivekpanchal/BabyApp
Я читаю данные и обновляю адаптер как это
CSV файл находится внутри репо в папке Raw
нужна помощь в обработке данных CSV
private void readData() {
InputStream is = getResources().openRawResource(R.raw.babynames);
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, Charset.forName("UTF-8"))
);
String line = "";
try {
reader.readLine();
String mGender,mMeaning,mName,mOrigin;
while ((line = reader.readLine()) != null) {
Log.d("MyActivity", "Line: " + line);
String[] tokens = line.split(",");
mGender=tokens[1];
mMeaning=tokens[2];
mName=tokens[3];
mOrigin=tokens[4];
BabyName babyName=new BabyName(mGender,mMeaning,mName,mOrigin);
babyName.setGender(mGender);
babyName.setName(mName);
babyName.setOrigin(mOrigin);
babyName.setMeaning(mMeaning);
database.babyDao().insert(babyName);
babyNames.add(babyName);
Log.d(TAG, "Just created: " + mGender+mMeaning+mName+mOrigin);
}
} catch (IOException e) {
Log.wtf("MyActivity", "Error reading data file on line" + line, e);
e.printStackTrace();
}
}
Я прошел через вашу ссылку проекта GitHub, ваш файл CSV имеет более 22 тыс. Записей. Другое дело, что вы не читаете данные из комнаты, вы только что ввели эти объекты и обновили адаптер с помощью ArrayList.
Прежде всего, вы не должны выполнять эту интенсивную работу CPU в основном потоке, это блокирует пользовательский интерфейс в течение длительного времени. [Только что протестированный код на моем устройстве]
Используйте рабочий поток или любой другой механизм потоковой передачи, такой как RxJava, для выполнения этой интенсивной работы CPU. Затем верните результат в главный поток и обновите свой пользовательский интерфейс.
Принимая это в дальнейшем, рассматривая записи 22K, вы должны рассмотреть возможность использования разбивки на страницы с библиотеками архитектуры Android
Выполняйте private void readData()
в другом потоке, private void readData()
список ваших объектов и вставляйте в базу данных все сразу. используя другой метод dao, как показано ниже
@Insert
void insertAll(List<BabyName> babyNames);
List<BabyName>
в List<BabyName>
используя database.babyDao().getAllData();
метод и в этом наблюдателе установите для BabyNames адаптер как adapter.setBabyNames(names)
и call adapter.notifyDatasetChanged()
Вот как вы можете наблюдать LiveData - пример ProductFragment
// Observe product data
model.getObservableProduct().observe(this, new Observer<ProductEntity>() {
@Override
public void onChanged(@Nullable ProductEntity productEntity) {
model.setProduct(productEntity);
// Update adapter data and notify dataset changed here
}
});
Если вы хотите следовать Руководствам по архитектуре Android, учитывая, что вы используете Database Room, перейдите к архитектуре MVVM. Вы запускаете задачу для обработки CSV после открытия приложения, и пользовательский интерфейс будет наблюдать за изменениями базы данных с помощью LiveData
. Поэтому, когда ваша обработка csv завершена и база данных обновлена, вы можете просмотреть все, что в вашем пользовательском интерфейсе
Обратитесь к этой странице за поддержкой Pagination - Android Pagination
Редактировать 1
Я создаю Pull Request на GitHub, который исправляет эту проблему. Теперь приложение работает как ожидалось.
Он исправляет следующие проблемы