Использование позиции третьего параметра для ListAdapter не будет равно id, особенно если строки были удалены.
Самый простой способ - использовать адаптер курсора, в этом случае идентификатор будет 4-м параметром, передаваемым в onItemClickListener
.SimpleCursorAdapter
вполне может быть достаточно.
Чтобы перейти к использованию SimpleCursorAdapter, выполните следующие действия: -
- Добавьте метод в свой DatabaseAccess.java для возврата курсора (или замените метод getData) например
: -
public Cursor getDataAsCursor() {
String[] columns = new String[]{"AD","SOYAD","rowid AS " + BaseColumns._ID};
return this.database.query(
"costumer_data",
columns,
null,null,null,null,null
);
}
- Обратите внимание, что не ясно, если вы определили столбец id или как он называется.Для адаптера Cursor требуется столбец с именами _id , (
BaseColumns._ID
разрешает до _id
) , следовательно, использование выше. - Был использован метод удобства запроса, а не метод rawQuery, хотя он может показаться более сложным, но рекомендуется по сравнению с rawQuery.
.
ДЛЯ ТЕСТИРОВАНИЯ добавить метод в DatabaseAccess.java, позволяющий добавлять данные
: -
public long addRow(String ad, String soyad) {
ContentValues cv = new ContentValues();
cv.put("AD",ad);
cv.put("SOYAD",soyad);
return this.database.insert("costumer_data",null,cv);
}
- Обратите внимание, что это может не потребоваться, если у вас уже естьданные или эквивалентный метод
.
Изменить MainActivity
: -
public class test extends AppCompatActivity {
ImageButton btnadd; //??
SQLiteDatabase sqLiteDatabase; // NOT NEEDED
DatabaseOpenHelper databaseHelper; // NOT NEEDED
TextView yekuntxt; //??
private ListView listView;
SimpleCursorAdapter adapter; // ADDED
Cursor cursor; // ADDED
DatabaseAccess databaseAccess; // ADDED
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
this.listView = (ListView) findViewById(R.id.listView);
databaseAccess = DatabaseAccess.getInstance(this); // Changed to use class variable
databaseAccess.open();
addSomeData(); // <<<< ADDED for testing (adds some data to the table (4 rows as below))
cursor = databaseAccess.getDataAsCursor(); // ADDED
//final List<String> costumer_data = databaseAccess.getData(); // REMOVED
//databaseAccess.close(); // <<<<<<<<<< MUST NOT CLOSE DB WHEN using Cursor (see onDestory method)
adapter = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_2, // (show AD and SOYAD seprately)
cursor, //<<<< The cursor used for the source data of the ListView
new String[]{"AD","SOYAD"}, // The columns FROM which to get the data
new int[]{android.R.id.text1, // The respective views TO which the data is placed
android.R.id.text2},
0
);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
{
Intent i = new Intent(test.this, activity_daxilet.class);
i.putExtra("ID", id);
startActivity(i);
}
}
});
}
//<<<<<<<<<< Added to close the Cursor and then database when done with it
@Override
protected void onDestroy() {
cursor.close();
databaseAccess.close();
super.onDestroy();
}
//<<<<<<<<<< Added to load some data for testing
private void addSomeData() {
databaseAccess.addRow("TestAD1","TestSOYAD1");
databaseAccess.addRow("TestAD2","TestSOYAD2");
databaseAccess.addRow("TestAD3","TestSOYAD3");
databaseAccess.addRow("TestAD4","TestSOYAD4");
}
}
- Комментарии должны объяснять внесенные изменения
.
Измените файл activity_daxilet.java, чтобы получить переданный идентификатор
: -
public class activity_daxilet extends AppCompatActivity {
TextView showpassedid;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_daxilet);
showpassedid = (TextView) this.findViewById(R.id.showpassedid);
long passedid = this.getIntent().getLongExtra("ID",-1);
showpassedid.setText("Id Passed was " + String.valueOf(passedid));
}
}
Измените файл activity_daxilet.xml, добавив в него текстовое представление showpassedid
, например: -
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".activity_daxilet">
<TextView
android:id="@+id/showpassedid"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
Результаты
При первом запуске: -

Нажмите на элемент (3): -
