Первая позиция не будет равно rowid / id строки в таблице.Предполагая, что у вас есть столбец id , определенный как your_id_column INTEGER PRIMARY KEY
(или с ключевым словом AUTOINCREMENT, который не имеет реальной разницы) и что вы не указываете значение при вставке строкитогда первый id будет, вероятно, равен 1, затем 2, затем 3 ... и т. д.
Однако position (3-й параметр, переданный в onItemClick / onItemLongClick) дляпервый элемент в списке будет 0, затем 1, затем 2 и т. д. Таким образом, вы никогда не удалите правильную строку (щелчок по первому элементу ничего не удалит, нажатие по второму элементу удалит первый), а при удалении строк он становится еще большерассинхронизировано.
4-ый переданный параметр ( длинный идентификатор ) будет rowid / id, ЕСЛИ И ТОЛЬКО ЕСЛИ используется CursorAdapter (т.е. Курсор являетсяисходные данные для ListView).В этом случае курсор ДОЛЖЕН иметь столбец с именем _id .Однако выглядит так, как будто faecherListe
является источником, а при использовании метода get
это ArrayList / List.Таким образом, переданный id будет иметь то же значение position , за исключением длинного.
Теперь, если faecherListe
были ArrayList<object_that_reflects_the_columns_of_the_table_including_id>
затем при условии получения getId вы можете использовать long retrieved_id = faecherListe.get(position).getId()
.Тем не менее, комментарии: -
Я полагаю, у вас есть ArrayList of String, поэтому вы получаете значение String из ArrayList - Shashanth 10 часов назад
Ye
У вас просто есть ArrayList и, следовательно, нет никаких средств для определения идентификатора, если только те данные, которые хранятся в строке, не гарантированно являются уникальными.
Пример
Этопример использования object_that_reflects_the_columns_of_the_table_including_id
в этом случае Feacher
класса, который просто имеет имя и id
Feacher.java
Это совершенно новый класс, который позволяет вам иметь ArrayList со всеми соответствующими данными / полями / столбцами (особенно столбец id ).то есть вы можете иметь ArrayList
public class Feacher {
private String name;
private long id;
public Feacher(String feacher_name) {
this(feacher_name,-1);
}
public Feacher(String feacher_name, long feacher_id) {
this.name = feacher_name;
this.id = feacher_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String toString() {
return name + " ID(" + String.valueOf(id) + ")";
}
}
DBHelper
Это помощник базы данных (подкласс SQLiteOpenHelper): -
public class DBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "feacher.db";
public static final int DBVERSION = 1;
public static final String TB_FEACHER = "feacher";
public static final String COL_FEACHER_ID = BaseColumns._ID;
public static final String COL_FEACHER_NAME = "feacher_name";
SQLiteDatabase mDB;
public DBHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
String crtsql = "CREATE TABLE IF NOT EXISTS " + TB_FEACHER +
"(" +
COL_FEACHER_ID + " INTEGER PRIMARY KEY," +
COL_FEACHER_NAME + " TEXT" +
")";
db.execSQL(crtsql);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
public long addFeacher(String feacher_name) {
ContentValues cv = new ContentValues();
cv.put(COL_FEACHER_NAME,feacher_name);
return mDB.insert(TB_FEACHER,null,cv);
}
public ArrayList<Feacher> getAllAsFeacherArrayList() {
ArrayList<Feacher> rv = new ArrayList<>();
Cursor csr = mDB.query(
TB_FEACHER,
null,
null,
null,
null,
null,
null
);
while (csr.moveToNext()) {
rv.add(new Feacher(
csr.getString(csr.getColumnIndex(COL_FEACHER_NAME)),
csr.getLong(csr.getColumnIndex(COL_FEACHER_ID))
)
);
}
return rv;
}
public int deleteFeacher(long id) {
return mDB.delete(
TB_FEACHER,
COL_FEACHER_ID + "=?"
,new String[]{String.valueOf(id)}
);
}
}
- the
deleteFeacher
метод удаления строки в соответствии с id , addFeacher
метод, позволяющий добавить некоторые тестовые данные. getAllAsFeacherArrayList
возвращает все данные какArrayList (примечание использует конструктор, который устанавливает id )
MainActivity.java
Активность, имеющая ListView.
public class MainActivity extends AppCompatActivity {
ListView mListView;
ArrayAdapter<Feacher> mAdapter;
DBHelper mDBHlpr;
ArrayList<Feacher> mFeacherList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = this.findViewById(R.id.listview);
mDBHlpr = new DBHelper(this);
addDataForTesting();
displayAdapter();
}
private void displayAdapter() {
if (mFeacherList == null) {
mFeacherList = mDBHlpr.getAllAsFeacherArrayList();
} else {
mFeacherList.clear();
for (Feacher f: mDBHlpr.getAllAsFeacherArrayList()) {
mFeacherList.add(f);
mAdapter.notifyDataSetChanged();
}
}
if (mAdapter == null) {
mAdapter = new ArrayAdapter<Feacher>(this,android.R.layout.simple_list_item_1,mFeacherList);
mListView.setAdapter(mAdapter);
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
mDBHlpr.deleteFeacher(mAdapter.getItem(i).getId());
displayAdapter();
return true;
}
});
}
}
private void addDataForTesting() {
mDBHlpr.addFeacher("Feacher 001");
mDBHlpr.addFeacher("Feacher 002");
mDBHlpr.addFeacher("Feacher 003");
}
}
- Обратите внимание на простоту, а также во избежание случайного удаления
onItemLongClick
.Важнейшим битом является mDBHlpr.deleteFeacher(mAdapter.getItem(i).getId());
, который получает идентификатор от предмета (объекта, Учителя), по которому щелкнули в соответствии с позицией.
activity_main.xml
Очень простоймакет
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
<ListView
android:id="@+id/listview"
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#FFAAAAFF"
>
</ListView>
</LinearLayout>
Результат
Вот снимок экрана после 3-го запуска, так что было добавлено 9 строк и 2 строки удалены (2 и 5 идентификатора примечания отсутствуют).Список будет обновлен после удаления, поэтому строка исчезнет почти сразу после завершения длинного щелчка.
![enter image description here](https://i.stack.imgur.com/XbjIi.jpg)