прослушиватель щелчков в OnBindViewholder recyclerview android

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

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

 @Override
 public void onBindViewHolder(ViewHolder holder, int position) {


     setListeners(holder,position);


    }

private void setListeners(ViewHolder holder, final int position) {
        holder.updownarrow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("ddfg",""+position);

            }
        });
        holder.leftlayout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });
    }

position будет удерживать позицию последнего держателя, который был привязан в onBindViewHolder, поскольку мой View не вызывает onBindViewHolder, когда я нажимаю на него, не должно положение удерживать позицию, которая была привязана последней, и показывать только эту позицию всякий раз, когда нажимается какое-либо представление?


person user6265154    schedule 08.06.2016    source источник


Ответы (3)


Позиция в onBindViewHolder совпадает с позицией в вашем адаптере / наборе данных. Ваш Click Listener устанавливается с position отдельным ViewHolder, представленным в вашем наборе данных во время привязки. Несмотря на то, что событие щелчка не вызывается до тех пор, пока все ваши представления не будут привязаны, каждый экземпляр функции уже был настроен для использования соответствующей позиции, в которой было установлено каждое представление.

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

person Sammy T    schedule 08.06.2016

Нет, position будет удерживать позицию последнего держателя, который был корзиной в onBindViewHolder, поскольку ваш View не вызывает onBindViewHolder, когда вы щелкаете по нему.

Есть много возможностей получить правильную позицию - например, если вы установите & получить позицию в Views tag или выполните поиск окружающего ViewHolder и проверьте его положение в адаптере или макете.

person yennsarah    schedule 08.06.2016
comment
вы сказали, что позиция будет удерживать позицию последнего держателя, который был привязан к onBindViewHolder. Затем предположим, что 5 представлений были привязаны, и я нажимаю на первое представление элемента, тогда он не должен показывать мне последнюю позицию, занимаемую последним привязанным представлением элемента ? - person user6265154; 08.06.2016
comment
Да, должно быть. Но это не означает, что ваш последний элемент списка является последним связанным представлением. - person yennsarah; 08.06.2016

Не используйте позицию в onBindViewHolder. использовать это:

final int adapterPosition = viewholder.getAdapterPosition();
// do what ever with it
person Tin Tran    schedule 08.06.2016