Настройка класса модели и пользовательского адаптера для получения rowID БД SQLite из onListItemClick - PullRequest
0 голосов
/ 19 марта 2020

У меня есть приложение, которое заполняет уже существующую базу данных 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;
}

1 Ответ

1 голос
/ 21 марта 2020

Одной из идей является замена списка пользовательских адаптеров с 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);
  }

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

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