ViewHolder не как внутренний класс

Может ли RecyclerView.ViewHolder использоваться не как внутренний класс? Есть ли какие-либо вопросы по этому поводу?

Я искал вокруг, но havent нашел любую документацию на нем!

На самом деле, я думаю, что ViewHolder должен быть либо статическим вложенным классом (с учетом статического!), Либо классом верхнего уровня (который фактически не будет отличаться, просто имя класса будет содержать имя внешнего класса, за которым следует $, а затем Внутреннее имя класса).

Почему я так думаю? Когда ViewHolder является нестационарным внутренним классом адаптера, он сохраняет ссылку на адаптер. Теперь, когда вы вызываете RecyclerView.swapAdapter (newAdapter, false) (или это правда? Я не помню), новый адаптер будет использовать ViewHolders, созданные ранее старым. Поскольку невозможно убрать / очистить такую ​​неявную ссылку в этих держателях, эта ссылка на первый адаптер просочилась и не может быть собрана мусором. Это плохо.

Но в моем случае у меня были реальные проблемы, не связанные с памятью. У моего адаптера была «модель выбора», которая сохраняла сопоставление между позициями и данными, и держатель вида использовал данные, когда показывал элемент (например, когда модель выбора указывала, что элемент в позиции 17 выбран, когда он был Нарисованный на экране, его цвет шрифта изменится), чтобы пометить его для пользователя. Он сделал это, просто обратившись к полю модели выбора из адаптера, который в Java означает, что он использует неявную ссылку на экземпляр входящего адаптера и получает доступ к его полю. Теперь, после swapAdapter, сохраненные ViewHolders все еще использовали модель выбора старого адаптера, и пользовательский интерфейс был сломан, так как некоторые элементы отображались как выбранные, тогда как в новой модели они не были.

По существу, невозможно, чтобы такие нестатические владельцы внутренних классов пережили адаптер, который их создал, и используются другим, чтобы действительно забыть старый и использовать новый адаптер, поскольку нет возможности очистить эту неявную ссылку.

Существует много решений, один из которых – для того, чтобы ViewHolder был статическим вложенным классом и просто дал ему ссылку на адаптер явно, когда он связывается, и обнуляет его, когда он отпадает. Я использую классы верхнего уровня для своих держателей просмотров с явными ссылками на адаптер, о которых я думаю, о чем вы спрашиваете. Имейте в виду, что очень часто держатели вообще не нуждаются ни в каких ссылках на свой адаптер, поэтому вам совсем необязательно устанавливать адаптер.

Конечно, моя проблема связана с тем, что я поменял курсор; Если вы этого не сделаете, вы, вероятно, никогда не заметите никаких проблем, но я думаю, что лучше всего их осознавать.