У меня есть приложение, которое заполняет уже существующую базу данных SQLite. Теперь мне нужно получить rowID (_id) при нажатии на элемент списка. Я думаю, что я не настроил свое приложение должным образом, чтобы иметь возможность сделать это. У меня были люди, которые предоставляли мне информацию о том, что делать, но я не могу понять это, пытаясь применить это к моему приложению. Может кто-нибудь привести пример, используя мой код? Я был бы очень признателен.
Вот мой класс модели:
package com.mypackage.myapp.model;
import android.database.Cursor;
public class Verse {
private Cursor verseCursor;
private String verseNotificationString;
private String verseTitleString;
private int dBrowIdInt;
private String bookNameString;
private String chapterNumberString;
private String verseNumberString;
private String verseString;
public Verse(Cursor cursor, String bookNameString, String chapterNumberString, String verseNumberString, String verseString) {
verseCursor = cursor;
verseTitleString = bookNameString + " " + chapterNumberString + ":" + verseNumberString;
verseNotificationString = verseString;
}
public Verse(int dBrowId) {
dBrowIdInt = dBrowId;
}
public Cursor getVerseCursor() {
return verseCursor;
}
public void setVerseCursor(Cursor verseCursor) {
this.verseCursor = verseCursor;
}
public String getVerseTitleString() {
return verseTitleString;
}
public String getNotificationString() {
return verseNotificationString;
}
public Integer getDbRowId() {
return dBrowIdInt;
}
public void setNotificationString(String notificationString) {
this.verseNotificationString = notificationString;
}
public void setTitleString(String titleString) {
this.verseTitleString = titleString;
}
}
Вот мой пользовательский адаптер:
package com.mypackage.myapp;
import android.content.Context;
import android.content.SharedPreferences;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.List;
public class VerseAdapter extends ArrayAdapter<String> {
private Context mContext;
private int mResource1;
private int mResource2;
public List<String> mVerses;
private List<Long> mRowId;
private TextView mVerseTextView;
private TextView mVerseNumberTextView;
private TextView mRowIdTextView;
private boolean mNightModeSwitchState;
private boolean mNightModeTwoSwitchState;
public VerseAdapter(Context context, int resource1, List<String>
verses, List<Long> rowId) {
super(context, resource1, verses);
this.mContext = context;
this.mResource1 = resource1;
this.mVerses = verses;
this.mRowId = rowId;
}
@Override
public int getCount() {
return mVerses.size();
}
@Override
public long getItemId(int position) {
return (position);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView,
@NonNull ViewGroup parent) {
View listItem = convertView;
int pos = position + 1;
if (listItem == null) {
listItem =
LayoutInflater.from(mContext).inflate(mResource1, parent, false);
}
//mRowIdTextView = (TextView)
listItem.findViewById(R.id.rowId);
//mRowIdTextView.setText(String.valueOf(getItemId(position)));
//mRowIdTextView.setText(String.valueOf(mRowId.get(position)));
mVerseNumberTextView = (TextView)
listItem.findViewById(R.id.verseNumber);
mVerseNumberTextView.setText(String.valueOf(pos) + " ");
mVerseTextView = (TextView)
listItem.findViewById(R.id.verseWords);
mVerseTextView.setText(mVerses.get(position));
SharedPreferences nightModeSwitchState =
getContext().getSharedPreferences("SettingsActivity", 0);
mNightModeSwitchState =
nightModeSwitchState.getBoolean("NightModeSwitchState", false);
SharedPreferences rowPosition =
getContext().getSharedPreferences("RowPosition", 0);
rowPosition.edit().putInt("RowPositionSqlite",
position).apply();
return listItem;
}
}
Вот мой метод onListItemClick в классе, из которого мне нужно получить доступ к rowID (Вы можете увидеть некоторые вещи, которые я пробовал и не работал закомментировано):
mListView.setOnItemClickListener(new
AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View
view, int position, long id) {
String selected = (String)
mListView.getItemAtPosition(position);
mVerseTextView = findViewById(R.id.verseWords);
mVerseNumberTextView = findViewById(R.id.verseNumber);
mAdapterView = adapterView;
mPositionForRow = position;
//mIdLong = id;
// VerseAdapter verseAdapter = (VerseAdapter)
adapterView.getAdapter();
// mSelectedVerse = (VerseForId)
mListView.getItemAtPosition(position);
// mDbRowId = mSelectedVerse.getDbRowId();
// mIdLong = verseAdapter.getItemId(position);
// mRowIdString = String.valueOf(id);
// VerseAdapter da = (VerseAdapter)
adapterView.getAdapter();
//mRowIdString =
String.valueOf(da.mVerses.get(position).getId());
// Toast.makeText(BibleBookVersesOldTestActivity.this,
mRowIdString + " id", Toast.LENGTH_LONG).show();
mBookCopied =
mVerseHeaderBookNameTextView.getText().toString();
mChapterNumberCopied =
Integer.toString(mChapterSelected + 1);
mVerseNumberCopied =
mVerseNumberTextView.getText().toString();
mPosition = position + 1;
mCopiedVerseListItem = mBookCopied + " " +
mChapterNumberCopied + ":" + mPosition + "\n\n" + selected;
showMenuVerseAction(view);
}
});
I Я знаю, что мне нужно что-то сделать в моем классе модели и в настраиваемом адаптере, чтобы настроить его для получения базы данных rowID onlistitemclick. Может ли кто-нибудь дать мне пример использования моего кода? Спасибо за вашу помощь.
******* Дополнение ... это мой класс Databaseaccess .... хорошо, одна его часть, где я рисую стихи из определенной книги из базы данных SQLite , Я настроил другой класс, который заполняет список, и поэтому мне пришлось изменить приведенную ниже операцию, чтобы использовать в классе модель Verse вместо String ... проблема, с которой я столкнулся, состоит в том, что строка ниже, которая читает list.add (курсор .getString (6)) где (6) относится к индексу столбца, из которого можно извлечь стих ... выдает ошибку, которую я не могу применить, getString к стиху ... как мне решить эту проблему?
public List<Verse> getVersesChapterOne() {
List<Verse> list = new ArrayList<>();
Cursor cursor = database.rawQuery("SELECT * FROM bookcombinedfull
LIMIT 31", null);
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
list.add(cursor.getString(6));
cursor.moveToNext();
}
cursor.close();
return list;
}