3

У меня есть RecyclerView. В layout для итема есть ImageView на котором висит onClick, вызывающий соответствующий метод в классе, в котором инициализирован этот RecyclerView. В аргументе метода я получаю View элемент по которому пользователь кликнул. Мне нужно узнать позицию итема в котором расположен этот элемент.

Я посмотрел документацию и там есть метод getChildAdapterPosition. Я передал ему view, чтобы получить номер итема в котором он расположен, но при клике на этот элемент у меня просто вылетает приложение.

Что я делаю не так?

Вот код метода, обработчика клика:

public void onClickHandler(View view) {
    switch (view.getId()) {
        case R.id.status_img:
            if (view.getTag() instanceof Roll) {
                Roll roll = (Roll) view.getTag();
                int recyclerPos = recyclerView.getChildAdapterPosition(view);
            }
            break;
    }

}
post_zeew
  • 21,983
  • в каком методе адаптера расположен этот кликер? – pavlofff Feb 02 '18 at 01:02
  • 2
    попробуйте так: position=recyclerView.findContainingViewHolder(view).getPosition(); – Andrey Mihalev Feb 02 '18 at 01:27
  • 3
    @AndreyMihalev если это внутри адаптера, то обращаться к виджету - крайне неразумное решение. Если это в активити, то обращаться надо к методу getAdapterPosition() холдера, так как getPosition() - deprecated, тогда решение имеет смысл. – pavlofff Feb 02 '18 at 04:52
  • 1
    @cheerful_weasel Если кликер указан в разметке, то смотрите вариант как сделано в этом ответе. Там для ListView, но принцип понятен, думаю. – pavlofff Feb 02 '18 at 04:53
  • 1
    @pavloff да, действительно, про getPosition уже прочитал. Спасибо, учту на будущее. – Andrey Mihalev Feb 02 '18 at 05:34
  • @pavloff кликер не в методе адаптера расположен, он в разметке, а обработчик в активити. В тег я уже передаю объект, поэтому позицию передать не могу. По объекту я вычисляю индекс массива в котором этот объект находится и на данный момент этого достаточно чтобы узнать позицию адаптера, но это сейчас они совпадают, а позже в адаптере будут ещё итемы другого типа и тогда сравнивать по индексу массива будет уже бесполезно. Поэтому мне и нужен метод вычисления позиции по вьюшке. Попробую сейчас совет с холдером. – cheerful_weasel Feb 02 '18 at 10:49
  • вы можете сделать объект-модель с любым количеством любых полей, заполнить нужными данными и передать ее через тег – pavlofff Feb 02 '18 at 10:59
  • @pavlofff мне не хотелось бы ради этого создавать класс, чтобы передать мой объект и позицию. Метод recyclerView.findContainingViewHolder(view).getAdapterPosition() работает. Так что спасибо за ответы, ваш ответ и ответ AndreyMihalev вместе дали результат который мне и нужен был. – cheerful_weasel Feb 02 '18 at 11:04
  • вы можете написать решение вашей проблемы, нажав "ответить на собственный вопрос", если вы нашли решение самостоятельно. – pavlofff Feb 02 '18 at 11:10
  • @pavlofff я бы не сказал что самостоятельно)) Андерй подсказал решение с position=recyclerView.findContainingViewHolder(view), а вы дополнили его ответ, поправив, что надо не getPosition() вызывать, а getAdapterPosition(). Так что благодаря этим двум советам у меня всё получилось. – cheerful_weasel Feb 02 '18 at 11:35

1 Answers1

0

В работе RecyclerView для каждого элемента корневого View, добавляется в объект View свойство LayoutParams типа android.support.v7.widget.RecyclerView.LayoutParams, в котором есть параметр mViewHolder, который содержит служебную информацию о положении View в RecyclerView.

При использовании метода getChildAdapterPosition(View ) происходит примерно следующее:

((android.support.v7.widget.RecyclerView.LayoutParams) view.getLayoutParams()).mViewHolder.getLayoutPosition();

Так как ImageView, на который повесили onClick, не является корневым View для элемента списка, у ImageView метод getLayoutParams возвращает объект не приводимый к типу android.support.v7.widget.RecyclerView.LayoutParams. Тем самым возникает ошибка каста и падение приложения.

Пример как можно лучше решить вопрос: http://whiteshieldsoftware.blogspot.ru/2016/01/recyclerview-6.html

kraftu
  • 521