адаптера RecyclerView,второй наследуется от первого,и третьи тоже наследуется от первого,поскольку особых отличий,кроме разметки,там нет. Для каждого фрагмента я определяю адаптер своего типа (у фрагментов есть тоже своё наследование,т.е один наследуется от другого). Но почему-то при выполнении кода:
@Override
protected RecyclerView.Adapter<?> getAdapter() {
return (AdapterTags)super.getAdapter();
}
возникает ClassCastException. Но он не должен возникать,т.к один адаптер наследуется от другого. Конечно можно сразу вызвать конструктор класса AdapterTags с двумя аргументами: списком и слушателем,но тогда мой код будет дублироваться в двух классах,кроме типа адаптера. Конечно можно всё запихнуть в один адаптер,но тогда,на мой взгляд,мой код будет менее гибким. Подскажите пожалуйста,как обойти это исключение. Заранее благодарю всех за помощь.
судя по ошибке и тому что я нагуглил, у тебя super.getAdapter() не является экземпляром AdapterTags попробуй посмотреть что возвращается сделай там условие if (adapter)
попробуй посмотреть что тебе возвращается в super.getAdapter() val adapter = super.getAdapter() if (adapter is AdapterTags) {
это из того что я нагуглил ну только на kotlin коде, а то хз как у тебя будет работать вроде вместо is там instaneof
Ну вообще исходный метод возвращает AdapterCategories,от которого и наследуется AdapterTags. protected RecyclerView.Adapter<?> getAdapter() { return new AdapterCategories(all, new OnItemClickListener() { … } });
просто ты получается в функции getAdapter возвращаешь общий класс адаптера и пытаешься привести возвращаемое значение к adapterTags, а он не является экземпляром общего класса адаптера поэтому и ошибка ClassCastExeption
Но ведь он же наследуется от класса AdapterCategories. Как же тогда правильно поступить? Я,конечно,могу вернуть AdapterTags,но тогда мой код будет дублироваться. Тогда придётся,наверное,создать отдельный метод для установки слушателя,и в другом классе использовать супер версию этого метода,либо всё-таки продублировать код,что мне лично не очень хочется делать.
если честно не знаю как у тебя устроен весь код, но по моему мнению, можно просто создать 3 адаптера которые наследуются от базового адаптера каждый
и обрабатывать их по своему если они отличаются
У меня и есть три адаптера,но только один наследуется от базового,а два остальных от первого.
а в чем надобность наследоваться от первого у двух последующих?
Потому что разметка одна и та же. К тому же мне достаточно выводить toString у объекта. Если нужно,я могу просто установить другой layout для других адаптеров,используя мой соответствующий метод.
И тут такой сюрприз...
ну тогда тебе надо возвращать не дочерний класс AdapterTags а именно базовый(как я понял это у тебя AdapterCategories)
просто пишут что нельзя возвращать подклассы в суперреализации getAdapter()
Но вернув базовый клас,есть риск утратить реализацию методов дочернего.
так вроде ж у тебя 1 базовый класс, в нем и должны быть все методы которые тебе могут понадобиться
Так в дочерних классах может отличатся их реализация.
ну так или иначе, в супер реализации getAdapter() можно взять только базовый класс, дочерние будут вызывать ошибку ClassCastExeption
В общем пока что просто вернул новый экземпляр AdapterTags,продублировав код и всё работает.
из того что я почитал пока все это гуглил, нужно делать базовый класс достаточно гибким для того чтобы от него наследоваться так что пересмотри как у тебя задизайнен базовый класс, мб его переделать стоит если ты все по SOLID делаешь
Обсуждают сегодня