Android onItemClick дает неверный идентификатор

Я пытаюсь получить сведения о выбранном элементе в ListView, запросив базу данных SQLite. Я передаю длинное значение идентификатора из onItemClick в качестве первичного ключа. Однако длинный идентификатор не совпадает с фактическим первичным ключом в таблице. Я узнал фактический первичный ключ, запросив первичные ключи всех строк в таблице.

У меня есть следующие вопросы: 1. Прав ли я, предполагая, что параметр long id в onItemClick (родитель AdapterView, View view, int position, long id) содержит первичный ключ элемента в таблице базы данных?

  1. Если нет, то как мне получить первичный ключ?

Я добавил свой код ниже:

list.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            //Display Client Details
            Intent displayclient = new Intent(view.getContext(), display_clientdetails.class);
            Integer db_id = (int) id;

            String TAG = "client_list";
            Log.d(TAG,"Position is" +position +" ID is " +db_id);

            displayclient.putExtra("client_id",db_id);
            view.getContext().startActivity(displayclient);

        }

});


person user2348956    schedule 01.03.2015    source источник


Ответы (2)


Нет, ты не прав. Если вы используете собственный адаптер, вы должны переопределить getItemId(int position), чтобы контролировать и возвращать все, что вы считаете своим идентификатором.

Обычно я использую что-то подобное, но это зависит от типа вашего первичного ключа. Вам также может потребоваться переопределить getItem(int position).

@Override
public long getItemId(int position) {
   return getItem(position).getId();
}
person Jofre Mateu    schedule 01.03.2015
comment
У меня это сработало после того, как я создал собственный адаптер и написал переопределение для метода getItemId. Однако я не понял, почему это сработало. Было бы здорово, если бы вы могли поделиться причиной, по которой getItemId не возвращает первичный ключ без переопределения. Спасибо. - person user2348956; 02.03.2015
comment
Это потому, что базовая функция не знает, что вы используете в качестве идентификатора. Было бы хорошо, если бы это работало из коробки, но, учитывая, сколько различных и пользовательских объектов вы можете передать адаптеру, это кажется сложным. Функция по умолчанию возвращает параметр положения, как показано здесь: android.googlesource.com/platform/frameworks/base/+/refs/heads/ - person Jofre Mateu; 05.03.2015

У меня есть следующие вопросы: 1. Прав ли я, предполагая, что параметр long id в onItemClick (родитель AdapterView, View view, int position, long id) содержит первичный ключ элемента в таблице базы данных?

да вы ошибаетесь. id, представленный в onItemClick, является результатом того, что возвращает getItemId вашего адаптера.

person Blackbelt    schedule 01.03.2015
comment
У меня это сработало после того, как я создал собственный адаптер и написал переопределение для метода getItemId. Однако я не понял, почему это сработало. Было бы здорово, если бы вы могли поделиться причиной, по которой getItemId не возвращает первичный ключ без переопределения. Спасибо - person user2348956; 04.03.2015
comment
какой адаптер вы использовали до перехода на кастомный? - person Blackbelt; 04.03.2015
comment
GetItemId ArrayAdapter возвращает позицию - person Blackbelt; 06.03.2015