2015-03-01 3 views
2

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

У меня есть следующие вопросы: 1. Правильно ли я полагаю, что длинный параметр id в onItemClick (родительский элемент AdapterView, представление 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); 

     } 

});

ответ

3

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

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

@Override 
public long getItemId(int position) { 
    return getItem(position).getId(); 
} 
+0

Он работал для меня после того, как я создал пользовательский адаптер и написал переопределение метода getItemId. Однако я не понял причины, почему это сработало. Будет здорово, если бы вы могли поделиться причиной, почему getItemId не возвращает первичный ключ, не будучи перегруженным. Благодарю. – user2348956

+0

Это потому, что базовая функция не знает, что вы используете как id. Было бы неплохо, если бы это сработало из коробки, но, учитывая, сколько разных и настраиваемых объектов вы могли бы использовать для адаптера, это кажется сложным. Функция по умолчанию возвращает параметр позиции, как вы можете видеть здесь: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/ArrayAdapter.java –

+0

Проверка исходного кода - хорошая идея. Спасибо – user2348956

0

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

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

+0

Он работал для меня после создания пользовательского адаптера и написал переопределение метода getItemId. Однако я не понял причины, почему это сработало. Будет здорово, если бы вы могли поделиться причиной, почему getItemId не возвращает первичный ключ, не будучи перегруженным. Спасибо, – user2348956

+0

Какой адаптер вы использовали, прежде чем переключиться на пользовательский? – Blackbelt

+0

Я использовал ArrayAdapter .. – user2348956