2016-09-06 6 views
7

У меня есть два RecyclerView.Adapter s, которые используют точно такие же RecyclerView.ViewHolder s как внутренние классы.Всегда ли RecyclerView.ViewHolder должен быть внутренним классом?

Я хотел избавиться от дублирования кода и сделал эти ViewHolder бесплатным, отдельным классом, поэтому новый класс теперь может использоваться любыми RecyclerView.Adapter s.

Однако я столкнулся с множеством проблем, например, с трудностями при доступе к объектам адаптера. getAdapterPosition() всегда возвращает -1.

Поэтому я передумал и сделал класс супер RecyclerView.Adapter, который расширяется этими адаптерами и помещает ViewHolder в суперкласс, чтобы эти адаптеры могли использовать его из подкласса.

Но я хочу знать, должен ли ViewHolder быть внутренним классом. Меня это раздражает. Пожалуйста, не мне советы, чтобы объединить классы адаптеров, они совершенно разные, как ViewHolder только специальный viewType, которые могут быть появиться в любом RecyclerView

Я жду ваших лучших подходов, которые заставляют меня чувствовать себя лучше.

С уважением.

+1

В Java нет даже реальных внутренних классов, только некоторые синтаксические сахара для написания классов одного и того же пакета в одном файле .java. Если у вас возникли проблемы с ViewHolders как не-внутренние классы, отправьте код проблемы. – laalto

ответ

3

ViewHolder может быть вне класса. Внутренний класс - это всего лишь предложение во всех учебниках для RecyclerView, это лучший способ, если ваш ViewHolder должен иметь доступ ко всем параметрам адаптера, даже к тем частным, но любые отношения доступа или объектов можно воссоздать методами доступа в Adapter и ViewHolder.

Я создал автономный проект с использованием ViewHolder как внешнего класса, посмотрите. Ссылка на репозиторий - https://github.com/maciejsikora/outsideviewholder.

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

Ответ на вопрос - ViewHolder не должен быть внутренним классом, а ваши проблемы вызваны недействительной реализацией кода при использовании ViewHolder как внешнего класса.

+0

В моем представлении есть кнопка, реализующая OnClickListener. При вызове слушателя мне нужно, чтобы кнопка объекта нажата, поэтому я должен получить доступ к положению адаптера. Однако вызов getAdapterPosition() возвращает мне -1, поэтому я разбил исключение IndexOutOfBounds, возможно, вы также получите -1 в своем проекте. :) –

+0

@ EgemenHamutçu Я уверен, что нет. Чтобы получить доступ к позиции, введите getter в Adapter и установите Adapter to ViewHolder. –

0

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

Проверьте это здесь: https://stackoverflow.com/a/29719632/6634292

Ваш вопрос интересный вопрос;)

4

На самом деле, Нет.

Сначала вам нужно понять, почему нам нужен внутренний класс?

Нам нужны внутренние классы, в которых мы хотим, чтобы этот функционал имел только определенный класс. Как у нас есть много внутреннего класса для многих Listeners и Button onClick и многие другие.

Таким образом, мы используем внутренний класс для , делая вещи частными, короткими и простыми.

Вы можете сделать эту вещь (ViewHolder) отдельным классом. Но это будет неэффективно, ясно (если вы сделаете еще один класс, он добавит дополнительный класс в ваш проект) и эффективным способом.

+0

Внутренние классы также являются «дополнительными классами». – laalto

+0

Да. Но они помогают нам писать чистый код. –

+0

Внутренние классы на самом деле очень плохие практики, потому что они «скрыты» в вашем проекте. Это «чище» и рекомендуется использовать принцип «один класс для каждого файла». – breakline