У меня есть ListView с разными раскладками для разных предметов. Некоторые элементы являются разделителями. Некоторые элементы отличаются, потому что они содержат различные виды данных и т. Д.
Я хочу реализовать ViewHolders для ускорения процесса getView, но я не совсем уверен, как это сделать. Разные макеты содержат разные фрагменты данных (что затрудняет именование) и разное количество видов, которые я хочу использовать.
Как мне это сделать?
Лучшая идея, которую я могу придумать, - это создать общий ViewHolder с элементами X, где X - это число видов в макете элемента с наибольшим числом из них. Для других представлений с небольшим количеством представлений я просто буду использовать подраздел этих переменных в ViewHolder. Скажем, у меня есть 2 макета, которые я использую для 2 разных предметов. Один имеет 3 TextViews, а другой - 1. Я бы создал ViewHolder с 3 переменными TextView и использовал бы только 1 из них для моего другого элемента. Моя проблема в том, что это может выглядеть очень уродливо и чувствовать себя действительно хакерским; особенно когда макет элемента может иметь много видов разных типов.
Вот очень простой getView:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyHolder holder;
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.layout_mylistlist_item, parent, false);
holder = new MyHolder();
holder.text = (TextView) v.findViewById(R.id.mylist_itemname);
v.setTag(holder);
}
else {
holder = (MyHolder)v.getTag();
}
MyListItem myItem = m_items.get(position);
// set up the list item
if (myItem != null) {
// set item text
if (holder.text != null) {
holder.text.setText(myItem.getItemName());
}
}
// return the created view
return v;
}
Предположим, у меня были разные типы макетов строк, я мог бы иметь ViewHolder для каждого типа строки. Но какой тип я бы объявил "держатель", чтобы быть на вершине? Или я бы объявил держателя для каждого типа, а затем использовал бы его для типа строки, в которой я нахожусь.