Android - Как получить позицию в bindView, как в getView?

В getView() из CursorAdapter есть параметр position, поэтому я могу выполнить проверку для этого position, как я могу сделать то же самое для bindView(), у него нет параметра position в BindView.

В настоящее время я переопределяю newView(), bindView() и getView(), о которых я читал и слышал, что это плохо, либо переопределяю getView() ИЛИ newView() и getView().

Спасибо.


person villager    schedule 28.01.2013    source источник
comment
Я не уверен, что ваше последнее утверждение верно. Я думаю, что это должно читаться Либо переопределить getView, либо (newView и bindView). Существует реализация по умолчанию getView, которая вызывает newView, если представления еще нет, и bindView, если представление перерабатывается.   -  person CoatedMoose    schedule 21.03.2013


Ответы (3)


Попробуй это

public void bindView(View arg0, Context arg1, Cursor arg2)
{
    int pos = arg2.getPosition();
}
person subair_a    schedule 28.01.2013
comment
да я думаю это оно. Но почему cursor.getPosition() в bindView отличается от результата выполнения cursor.getPosition() в newView. Подробнее об этом здесь: stackoverflow.com/questions/14557251/ - person villager; 28.01.2013

codeboys отвечает правильно, подойдет cursor.getPosition(). Но если кому-то нужна позиция в событии onClick подэлемента listitems, например, значок внутри listItem, решение состоит в том, чтобы поместить позицию как setTag на значок и получить ее при возникновении события:

@Override
public void bindView(View vw, Context ctx, final Cursor cursor) {
    /* ...
    *  do your binding 
    */
    ImageView icon = (ImageView) vw.findViewById(R.id.your_icon);
    icon.setTag(cursor.getPosition());   // here you set position on a tag
    icon.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //  use a tag to get the right position 
            ((MainActivity) context).onIconClick((int)v.getTag());
        }
    });
}
person EmCeSquare    schedule 22.08.2016
comment
Здесь нет необходимости использовать тег, потому что Java поддерживает замыкания. Вы можете использовать pos, захваченный из внешнего контекста внутри вашего прослушивателя кликов, если он определен внутри bindView, как в вашем примере. - person SergGr; 01.03.2017

person    schedule
comment
как узнать, с каким представлением я имею дело в bindView, если у меня есть два макета в newView. см. stackoverflow.com/questions/14557251/ - person villager; 28.01.2013
comment
Так не пойдет. ListView перерабатывает строки, поэтому newView вызывается только для подмножества всех строк, которые вы можете прокручивать. Если бы вы использовали getPosition() в bindView, вы бы эффективно отслеживали текущую нарисованную позицию. - person CoatedMoose; 21.03.2013
comment
@CoatedMoose Тогда как бы вы это сделали? - person theblang; 08.11.2013
comment
@mattblang, как я сказал в своем предыдущем комментарии, реализация по умолчанию не вызывает newView для каждого элемента списка, потому что она повторно использует элементы списка. Повторно используемый элемент списка вызывается в bindView, поэтому вам нужно использовать cursor.getPosition() как в bindView, так и в newView. - person CoatedMoose; 18.11.2013