Лучше ли использовать несколько SpanObjects или несколько TextViews в Android?

У меня есть ListView , у которого есть TextView и в каждом TextView несколько элементов, каждое из которых содержит краткое описание. Чтобы применять разные стили к элементам и описанию, я использую объекты с множественным диапазоном: ClickableSpan , ForegroundColorSpan , BackgroundColorSpan , AbsoluteSizeSpan и StyleSpan .

В среднем ListView имеет 10 TextView s, и каждый TextView имеет 10 пар элемента / описания, и каждая пара использует около 6 SpanObject s, поэтому в общей сложности ~ 600 SpanObject s для ListView . И когда пользователь нажимает на один из элементов, ListView очищается и снова перерисовывается, генерируя еще один набор из 600 SpanObject s.

Поэтому мне интересно, было бы лучше создать один TextView для каждого элемента и каждого описания и отформатировать его через XML, а не TextView с диапазоном, таким образом, было бы около 200 TextView s и не SpanObject s.

В качестве примечания я не начинал с такого подхода, потому что иерархическое дерево представлений было бы более сложным, а TextView – более дорогостоящим для создания этого SpanObject s, но теперь, когда я вижу количество SpanObject я создаю. Я Не уверен, что лучше. Я также думаю, чтобы начать писать механизм рециркуляции, но не уверен, стоит ли это или это не должно быть проблемой для Android GC.

Я знаю, что прошло уже пару лет с тех пор, как вы задали этот вопрос, и я надеюсь, что вы нашли ответ, но я думал, что отвечу на ваш вопрос.

Количество TextViews и SpanObjects, которые у вас есть, невероятно дорого для любого устройства Android, и загрузка их каждый раз может не только вызвать задержку, но, возможно, связанную с OOM сбой (из памяти).

Подход к решению этого – использование RecyclerView и CardView. Сначала напишите свой адаптер RecyclerView. В этом классе напишите статический класс, который загружает все текстовые элементы и другие элементы в каждой карте (карта по существу является элементом списка). Таким образом, все ваши элементы загружаются в OnCreate и не генерируются непрерывно. Это особенно полезно, если вы используете фрагменты. Эта ссылка может вам пригодиться: http://www.binpress.com/tutorial/android-l-recyclerview-and-cardview-tutorial/156

Ниже приведен пример класса адаптера RecyclerView со статическим классом:

 public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> { private List<ContactInfo> contactList; public ContactAdapter(List<ContactInfo> contactList) { this.contactList = contactList; } @Override public int getItemCount() { return contactList.size(); } @Override public void onBindViewHolder(ContactViewHolder contactViewHolder, int i) { ContactInfo ci = contactList.get(i); contactViewHolder.vName.setText(ci.name); contactViewHolder.vSurname.setText(ci.surname); contactViewHolder.vEmail.setText(ci.email); contactViewHolder.vTitle.setText(ci.name + " " + ci.surname); } @Override public ContactViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { View itemView = LayoutInflater. from(viewGroup.getContext()). inflate(R.layout.card_layout, viewGroup, false); return new ContactViewHolder(itemView); } //Static class that loads all card item components public static class ContactViewHolder extends RecyclerView.ViewHolder { protected TextView vName; protected TextView vSurname; protected TextView vEmail; protected TextView vTitle; public ContactViewHolder(View v) { super(v); vName = (TextView) v.findViewById(R.id.txtName); vSurname = (TextView) v.findViewById(R.id.txtSurname); vEmail = (TextView) v.findViewById(R.id.txtEmail); vTitle = (TextView) v.findViewById(R.id.title); } } }