Я создал адаптер для ListView, который имеет два типа строк. ListView имеет 4 строки. Последняя строка имеет разный макет, поэтому я использую метод GetItemViewType в getview.Понимание шаблона ViewHolder
Я пытаюсь понять, как работает шаблон. Я наблюдал за этим: https://www.youtube.com/watch?v=bWsWe9T9HJw, чтобы получить лучшее понимание того, как работает переработка
Что я не понимаю: когда я прокрутки вниз в моем ListView, то convertview всегда нуль. Когда я снова прокручиваю резервную копию, convertview не является нулевым и может использоваться повторно.
Нельзя ли преобразовать view только null для первого элемента в списке? я не понимаю, почему это нуль для каждого нового элемента?
public override View GetView (int position, View convertView, ViewGroup parent)
{
BaseBundelVO bundle = _bundles [position];
DSBundleListItem bundleHolder = null;
DSBundleArchiveItem archiveHolder = null;
int type = GetItemViewType(position);
if (convertView == null)
{
bundleHolder = new DSBundleListItem (_activity);
archiveHolder = new DSBundleArchiveItem (_activity);
switch (type)
{
case 0:
convertView = _activity.LayoutInflater.Inflate (Resource.Layout.dsBundleListItem, null);
bundleHolder.IconIv = convertView.FindViewById<ImageView> (Resource.Id.iconIv);
bundleHolder.CoverIv = convertView.FindViewById<ImageView> (Resource.Id.coverIv);
bundleHolder.CoverTitleTv = convertView.FindViewById<TextView> (Resource.Id.coverTitleTv);
bundleHolder.CoverSubTitleTv = convertView.FindViewById<TextView> (Resource.Id.coverSubTitleTv);
bundleHolder.BundleProgress = convertView.FindViewById<ProgressBar> (Resource.Id.bundleProgress);
convertView.Tag = bundleHolder;
break;
case 1:
convertView = _activity.LayoutInflater.Inflate (Resource.Layout.dsBundleArchiveItem, null);
archiveHolder.ArchiveTitleTv = convertView.FindViewById<TextView> (Resource.Id.archiveTitleTv);
archiveHolder.ArchiveSubTitleTv = convertView.FindViewById<TextView> (Resource.Id.archiveSubTitleTv);
convertView.Tag = archiveHolder;
break;
}
}
else
{
switch (type)
{
case 0:
bundleHolder = (DSBundleListItem)convertView.Tag;
Console.WriteLine (bundleHolder.IsDisposed());
bundleHolder.RemoveImageLoaderCallBack();
break;
case 1:
archiveHolder = (DSBundleArchiveItem)convertView.Tag;
Console.WriteLine (archiveHolder.IsDisposed());
archiveHolder.RemoveImageLoaderCallBack();
break;
}
}
switch (type)
{
case 0:
bundleHolder.CoverTitleTv.Text = bundle.Title;
bundleHolder.CoverSubTitleTv.Text = bundle.SubTitle;
bundleHolder.LoadImage(bundle.CoverImageLocation,bundle.Icon);
break;
case 1:
archiveHolder.ArchiveTitleTv.Text = "Archief";
archiveHolder.ArchiveSubTitleTv.Text = "Bekijk onze eerder verschenen publicaties";
break;
}
return convertView;
}
Если ваш экран может поместиться, скажем, 2 вида, то андроид загрузит представление вверх, 2 видимых вида и следующее представление внизу, так что ему нужно как минимум 4 вида. Это объясняет, почему это не только first convertview null. Btw FIY вы должны проверить новый RecyclerView с Api 21. –