Фон
Я использую библиотеку PinterestLikeAdapterView для отображения некоторых изображений из Интернета, что похоже на gridView, но с разной высотой для каждой ячейки.
Эта проблема
Поскольку я использую эту библиотеку для отображения изображений из Интернета, очень важно, чтобы при вызове notifyDatasetChanged не происходило беспорядка в представлениях.
По какой-то причине вызов этой функции вызвал бы метод getView () с разными позициями для представлений. например, хотя я вообще не прокручиваю и вызываю notifyDatasetChanged (или addAll в случае, если это ArrayAdapter), для позиции 0 он будет иметь вид позиции 8, для позиции 1 он будет принимать вид позиции 7 и так далее ...
Это заставляет всю сетку обновлять изображения и тем самым разрушает UX.
Обычно как в gridView, так и в listView способ преодоления обновления состоит в том, чтобы поместить позицию, которая использовалась для представления, внутри viewHolder, и если они равны, это означает, что они все еще совпадают.
Например:
... getView(...)
{
//<=inflate a new view if needed
//avoid refreshing view in case it's still the same position:
if(position==holder.position)
return rootView;
holder.position=position;
//<=update the view according to its data
...
}
Однако здесь они повторно используют другие представления в другом порядке, поэтому этот трюк здесь не сработает.
Из-за этой проблемы я не только получаю обновления почти всех видимых представлений, но, поскольку я использую библиотеку DiskCacheLru, она вылетает, поскольку он пытается поместить 2 идентичных данных inputSteam в один и тот же ключ, используя 2 потока.
Вопрос
Что я могу сделать? Это известная ошибка в библиотеке?
Может я плохой способ побороть обновления?
на данный момент я использую кеш памяти, по крайней мере, чтобы получить элементы, которые были кэшированы раньше, но это больше похоже на «лекарство», чем на «вакцину» ...
notifyDataSetChanged
у вас не будет старых convertView вgetView
. - person Sherif elKhatib   schedule 14.10.2013getViewTypeCount()
иreturn getCount();
внутри него. 2- переопределитьgetItemViewType(int position)
иreturn position;
внутри него. - person Sherif elKhatib   schedule 14.10.2013