Android 设置模型类和自定义适配器以从onListItemClick获取SQLite DB rowID

Android 设置模型类和自定义适配器以从onListItemClick获取SQLite DB rowID,android,sqlite,listview,adapter,rowid,Android,Sqlite,Listview,Adapter,Rowid,我有一个从预先存在的SQLite数据库填充的应用程序。我现在需要在单击列表项时获取rowID(_id)。我认为我没有正确设置我的应用程序来实现这一点。我已经有人向我提供了关于做什么的建议,但当我尝试将其应用到我的应用程序时,我似乎无法理解。有人能用我的代码提供一个例子吗?我会非常感激的 这是我的模型课: package com.mypackage.myapp.model; import android.database.Cursor; public class Verse { privat

我有一个从预先存在的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;
}
package com.mypackage.myapp;
导入android.content.Context;
导入android.content.SharedReferences;
导入androidx.annotation.NonNull;
导入androidx.annotation.Nullable;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.TextView;
导入java.util.List;
公共类VSEADAPTER扩展了ArrayAdapter{
私有上下文;
私人内部资源1;
私人内部资源2;
公开名单;
私有列表mRowId;
私有文本视图mVerseTextView;
私有文本视图mVerseNumberTextView;
私有文本视图mRowIdTextView;
私有布尔mNightModeSwitchState;
私有布尔mNightModeTwoSwitchState;
public-VerseAdapter(上下文,int-resource1,列表
诗句(罗维德){
超级(上下文、资源1、诗句);
this.mContext=上下文;
this.mResource1=resource1;
这是一首诗;
this.mRowId=rowId;
}
@凌驾
public int getCount(){
返回mVerses.size();
}
@凌驾
公共长getItemId(int位置){
返回(位置);
}
@非空
@凌驾
公共视图getView(int位置,@Nullable视图convertView,
@非空视图组(父视图组){
查看列表项=转换视图;
int pos=位置+1;
如果(listItem==null){
列表项=
LayoutInflater.from(mContext).充气(mResource1,父级,false);
}
//mRowIdTextView=(TextView)
listItem.findViewById(R.id.rowId);
//mRowIdTextView.setText(String.valueOf(getItemId(position)));
//mRowIdTextView.setText(String.valueOf(mRowId.get(position));
mVerseNumberTextView=(文本视图)
listItem.findViewById(R.id.verseNumber);
mVerseNumberTextView.setText(String.valueOf(pos)+”);
mVerseTextView=(TextView)
listItem.findViewById(R.id.verseWords);
mVerseTextView.setText(mVerses.get(position));
SharedReferences nightModeSwitchState=
getContext().GetSharedReferences(“SettingsActivity”,0);
mNightModeSwitchState=
getBoolean(“nightModeSwitchState”,false);
SharedReferences行位置=
getContext().GetSharedReferences(“行位置”,0);
rowPosition.edit().putInt(“RowPositionSqlite”,
位置)。应用();
返回列表项;
}
}

下面是我需要从类中访问rowID的onListItemClick方法(您可以看到一些我尝试过但没有成功的东西):

mListView.setOnItemClickListener(新建)
AdapterView.OnItemClickListener(){
@凌驾
公共视图单击(AdapterView AdapterView,视图
视图,int位置,长id){
所选字符串=(字符串)
mListView.getItemAtPosition(位置);
mVerseTextView=findviewbyd(R.id.verseWords);
mVerseNumberTextView=findViewById(R.id.verseNumber);
mAdapterView=adapterView;
mPositionForRow=位置;
//mIdLong=id;
//VSEADAPTER VSEADAPTER=(VSEADAPTER)
adapterView.getAdapter();
//mSelectedVerse=(versefrid)
mListView.getItemAtPosition(位置);
//mDbRowId=mSelectedVerse.getDbRowId();
//mIdLong=verseAdapter.getItemId(位置);
//mRowIdString=String.valueOf(id);
//VSEADAPTER da=(VSEADAPTER)
adapterView.getAdapter();
//mRowIdString=
valueOf(da.mVerses.get(position.getId());
//Toast.makeText(BibleBookVersesOldTestActivity.this,
mRowIdString+“id”,Toast.LENGTH_LONG).show();
MBook=
mVerseHeaderBookNameTextView.getText().toString();
McHapterNumber=
整数.toString(mChapterSelected+1);
MVersEnumberCopy=
mVerseNumberTextView.getText().toString();
位置=位置+1;
mCopiedVerseListItem=mBookCopied+“”+
mChapterNumberCopied+“:“+mPosition+”\n\n“+已选定;
ShowMenuVersaction(视图);
}
});
我知道我需要在我的模型类和自定义适配器中进行一些设置,以便能够检索数据库rowID onlistitemclick。有人能用我的代码给我举个例子吗?谢谢你的帮助

*******另外。。。。这是我的数据库访问类。。。。其中的一部分,我从SQLite数据库中的某本书中提取了一些诗句。我已经调整了填充列表的另一个类,因此必须更改下面的操作,以接受模型类的韵文,而不是列表中的字符串。。。我遇到的问题是,下面的一行读取list.add(cursor.getString(6)),其中(6)指的是要从中提取韵文的列索引。。。给出了一个错误,我无法将该getString应用于Verse。。。我如何解决这个问题

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;
}
public List getVersesChapterOne(){
列表=新的ArrayList();
Cursor Cursor=database.rawQuery(“从bookcombinedfull中选择*
限值31“,空);
cursor.moveToFirst();
而(!cursor.isAfterLast()){
list.add(cursor.getString(6));
cursor.moveToNext();
}
cursor.close();
退货清单;
}

一个想法是将自定义适配器的列表从
String
替换为您的型号
Verse
。通过这种方式,可以使用
.getItem()
从模型类中检索所需的任何信息

// public class VerseAdapter extends ArrayAdapter<String> {
public class VerseAdapter extends BaseAdapter {

  public List<String> mVerses;

  // public VerseAdapter(Context context, int resource1, List<String> verses, List<Long> rowId) {
  public VerseAdapter(Context context, int resource1, List<Verse> verses) {
    //...
    mVerses = verses;
    //...

  @Override
  public Object getItem(int i) {
    return (Verse)mList.get(i);
  }

// ...

非常感谢你。我已经开始犯错误了
// public class VerseAdapter extends ArrayAdapter<String> {
public class VerseAdapter extends BaseAdapter {

  public List<String> mVerses;

  // public VerseAdapter(Context context, int resource1, List<String> verses, List<Long> rowId) {
  public VerseAdapter(Context context, int resource1, List<Verse> verses) {
    //...
    mVerses = verses;
    //...

  @Override
  public Object getItem(int i) {
    return (Verse)mList.get(i);
  }

// ...
// In your MainActivity.java, do this to get your item:

Verse verse = (Verse) mAdapter.getItem(position);
Log.d(TAG, verse.getVerseTitleString());