Android - Как эффективно загружать большое количество текста в TextView? - программирование
Подтвердить что ты не робот

Android - Как эффективно загружать большое количество текста в TextView?

Я пишу приложение для Android, которое читает один текстовый файл и отображает его на TextView.

То, что я делаю прямо сейчас, - это прочитать весь файл в String (используя BufferedReader и StringBuilder) и отобразить его на TextView с помощью setText(string). Текстовый файл размером 700 КБ может занять от 2 до 3 секунд, прежде чем он будет отображаться на экране.

Но я использовал некоторые другие читатели электронных книг на рынке, и они могут отображать один и тот же текст почти мгновенно. Кто-нибудь знает, как я могу это достичь?

Спасибо.

Изменить. Многие предлагают ListView, но это не работает для моего конкретного случая. Это из моего ответа на один из ответов:... [ListView] не работает для меня по нескольким причинам. (1) Чтобы Listview выглядел как TextView, мы должны разбить текст на новый символ строки. Если я загружаю один большой абзац, он так же медленен, как и загрузка TextView. (2) Поскольку ListView только измеряет элемент на экране, я не могу заранее знать общие "страницы" или "высоту" всего текста.

4b9b3361

Ответ 1

По сути, ключ состоит только в том, чтобы загружать нужные вам данные, когда вам это нужно. Один из способов сделать это - поставить каждый абзац в свой собственный TextView, который помещается в ListAdapter, который включен в ListView. Должен быть какой-то набор индексов, так что каждый абзац знает, где найти файл данных. Этот интерфейс позволит вам загружать только то, что вам нужно, когда вам это нужно. Ваш адаптер списка выглядит примерно так (этот код не является полным, но он должен дать вам представление о том, что вы должны делать):

class ParagraphAdapter extends ListAdapter{
ArrayList<Integer> mLocations; // Somewhere define this to your locations, I'll leave that for you to figure out
protected View getView(int position,View convertView, ViewGroup parent)
{
  mLocations.get(position); // Read the file starting at this position, until the next value
  String text; // This is the output of the above
  TextView tv=new TextView(context);
  tv.setText(parent.getContext());
}
}

Можно отметить, что Amazon использует систему подкачки для приложения Kindle. Если у вас есть приложение, вы можете увидеть внизу каждой страницы, в каком разделе вы находитесь. Каждая "страница", вероятно, ближе к предложению или так по длине. Тогда это просто вопрос получения правильной страницы, что можно довольно быстро сделать.

Ответ 2

Чтобы добавить то, что сказал @PearsonArtPhoto -

Я предлагаю вам реализовать какой-то механизм подкачки, чтобы разделить текст на страницы.
То, что вам нужно сделать, это разделить текст в соответствии с допустимым числом символов N + M на страницы.
N = фиксированное количество символов.
M = количество символов от N до ближайшего символа строки (так что вы не увидите последнего линия "вырезана" ).
Я бы предположил, что если ваше устройство Android позволит вам сохранить это "в памяти" -
сделайте это,
и не пытайтесь извлечь из файла одну страницу за другой, а скорее получить из структуры "в памяти" - это улучшит производительность.
Когда вы прокрутите и поймете, что вам нужно получить следующую страницу, извлеките ее из структуры "в памяти" .

Ответ 3

Lucas Rocha создал для этой цели красивую библиотеку под названием Smoothie.

http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/

В конце этих рекомендаций по производительности для Android listview есть ссылка на объяснение о Smoothie, и, наконец, вы найдете библиотеку, доступную в github.

Первоначально описанный для загрузки изображений, подход применяется и для загрузки текста.

Ответ 4

Вы должны учитывать, используете ли вы правильные компоненты. Может быть, лучше читать строки и помещать их в список.

попробовать

List<String> lines; 
listview.adapter(new ArrayAdapter<String>(...,lines));

И много раз, что то, что вы видите (Look and Feel), не похоже на то, что вы думаете.

Ответ 5

Вы можете использовать библиотеку подкачки Android из Jetpack с пользовательским представлением или RecyclerView.

https://developer.android.com/topic/libraries/architecture/paging

  1. Реализовать абстракцию DataSource, предоставляющую список диапазонов данных
  2. Реализация абстракции хранилища, которая предоставляет реальные данные (из базы данных, сети, файлов и т.д.)
  3. Используйте RecyclerView и Adapter для отображения данных

Пример приложения для отображения содержимого больших файлов можно найти здесь https://github.com/YablokovDmitry/FileView.