У меня есть ListView с разными макетами для разных элементов. Некоторые элементы являются разделителями. Некоторые элементы разные, потому что они содержат разные типы данных и т.д.
Я хочу реализовать ViewHolders, чтобы ускорить процесс getView, но я не совсем уверен, как это сделать. Различные макеты имеют разные части данных (что затрудняет именование) и разные количества видов, которые я хочу использовать.
Как мне это сделать?
Лучшей идеей, которую я могу придумать, является создание общего ViewHolder с элементами X, где X - количество просмотров в макете элементов с наибольшим количеством из них. Для других представлений с небольшим количеством представлений я просто использую подраздел этих переменных в ViewHolder. Так сказать, у меня есть 2 макета, которые я использую для двух разных предметов. У одного есть 3 TextViews, а у другого - 1. Я бы создал ViewHolder с тремя переменными TextView и использовал только один из них для моего другого элемента. Моя проблема в том, что это может стать действительно уродливым и выглядеть действительно взломанным; особенно когда макет элемента может иметь много видов для разных типов.
Вот очень простой 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 для каждого типа строки. Но какой тип я бы назвал "держателем" на вершине? Или я могу объявить держатель для каждого типа, а затем использовать его для типа строки, в которой я включен.