получить позицию в bindView с помощью CursorAdapter

я создаю список, который имеет два TextView и один пользовательский вид в качестве индикатора выбора, для загрузки данных я использую CursorAdapter и переопределяю bindView и newView. но проблема в сохранении индекса выбора.

когда я нажимаю на элемент списка, я сохраняю его позицию в поле зрения следующим образом

View v1=(View)view.findViewById(R.id.viewColor);
v1.setTag(position)

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

 Integer position = (Integer) v1.getTag();

но я не получаю возможности сравнивать именно так, как мы получаем в getView. я попробовал cur.getPosition() - это позиция записи в курсоре, которая не будет соответствовать v1.getTag().

я попытался переопределить getView следующим образом, но не получил точную позицию

@Override
public View getView(final int position, View convertView, ViewGroup parent){

    this.position = position;
    return super.getView(position, convertView, parent);


}

так как я могу получить позицию в bindView? мне нужно использовать getView или что? Я изучил множество тем, но не получил определенного ответа, когда дело доходит до bindView.

РЕДАКТИРОВАТЬ

        @Override
        public void onItemClick(AdapterView<?> adapter, View view, int position,
                long arg3) {


                    view.setTag(position); 
                   // i save the position on list item click so that when adapter loads the 
                   // the list i can match the position with the current one

          }

введите здесь описание изображения


person Hunt    schedule 27.12.2014    source источник


Ответы (4)


Для этого сначала вам нужно переопределить getView() и установить позицию здесь, а затем получить к ней доступ в bindview().

@Override
public View getView(int position, View convertview, ViewGroup arg2) {
    if (convbertview == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        convertview = inflater.inflate(R.layout.your layout,
                null);
    }
    convertview.setTag(position);
    return super.getView(position, convbertview, arg2);
}

и в bindView() получите свою позицию, как

@Override
public void bindView(View view, Context context, Cursor cursor) {
    int position=(Integer) view.getTag();//here is the position

}
person kalyan pvs    schedule 27.12.2014
comment
если я использую convertView для хранения позиции, то где я буду хранить позицию щелчка элемента? - person Hunt; 27.12.2014
comment
@Hunt, извини... я не понял тебя. - person kalyan pvs; 27.12.2014
comment
@Hunt в элементе, нажмите, чтобы получить позицию. В чем проблема ?? - person kalyan pvs; 27.12.2014
comment
@Hunt, что ты будешь делать в onitemClick. Почему тебе нужно сохраняться?? - person kalyan pvs; 27.12.2014
comment
чтобы сохранить состояние выбранного элемента, так как я меняю цвет строки при выборе элемента. - person Hunt; 27.12.2014
comment
Давайте продолжим это обсуждение в чате. - person Hunt; 27.12.2014
comment
@Hunt сохраните его в ArrayList или в SparcebooleanArray - person kalyan pvs; 27.12.2014

Не переопределяйте getView, так как вы используете CursorAdapter. Вы можете зарегистрировать onClickListener в bindView. Допустим, вы слушаете нажатие на значок, а затем делаете следующее:

@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());
    icon.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // here you pass right position to your activity
            ((MainActivity) context).onIconClick((int)v.getTag());  
        }
    });
}

В вашей деятельности просто:

public void onIconClick(int position) {
    // do your stuff
}
person EmCeSquare    schedule 22.08.2016

Измените свой onItemClick, как показано ниже.

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    mAdapter.setId(id);
    //Set the selector here
}

Затем сохраните одну переменную id в адаптере и напишите для нее сеттеры и геттеры. затем измените метод bindView(), как показано ниже.

@Override
public void bindView(View view, Context context, Cursor cursor) {

    long tempId = cursor.getLong(cursor.getColumnIndex("_id"));

    if(tempId==id){
        //Set the selector color here
    }
    else{
        //Set the default color here
    }

    //Remaing your logic here
}

Таким образом, вам не нужно переопределять метод getView().

Если вы хотите выбрать несколько представлений, вы должны поддерживать ArrayList идентификаторов...

person KomalG    schedule 27.12.2014
comment
идентификатор курсора отличается от позиции элемента списка. Этот курсор также будет динамически изменяться в зависимости от требований пользователя, таких как поиск по редактированию текста. - person kalyan pvs; 27.12.2014
comment
но позиция курсора change.id не равна позиции. - person kalyan pvs; 27.12.2014
comment
хорошо .. позвольте мне объяснить ясно. если у вас есть идентификатор списка с 10 на позиции 4, идентификатор с 11 на позиции 5. В bindview мне нужна позиция с идентификатором 10 .. тогда как вы дадите ?? судя по вашему ответу, я получу tempid как 10, но не 4. Оп спросил о позиции, а не об идентификаторе. - person kalyan pvs; 27.12.2014
comment
Намерение @Hunt состоит в том, чтобы поддерживать селектор списка. Хорошо, если вам нужна позиция, тогда сохраните позицию вместо _id, и вы получите позицию в bindView() с помощью cursor.getPosition(); - person KomalG; 27.12.2014
comment
но он задал вопрос с заголовком, как получить позицию в bindView с помощью CursorAdapter - person kalyan pvs; 27.12.2014

Внутри метода «bindView», но вне «onClickListener()»:

  1. final int position = cursor.getPosition();

  2. Внутри "onClickListener()":

cursor.moveToPosition(position); //retrieve any data you want after this

Удачи~

person Sam Chen    schedule 28.11.2018