Вам необходимо
- добавить ListView к соответствующему макету начальной операции.
- создать вспомогательный класс базы данных, который будет:
- Проверьте, чтобы увидетьесли база данных уже существует
- Если база данных не существует, скопируйте базу данных из папки ресурсов.
- предоставьте методы для доступа к данным по мере необходимости (в случае заполнения Listview метод будетпотребуется для извлечения данных, которые должны быть перечислены)
- в начальном действии получить экземпляр класса помощника базы данных
- получить ListView через его идентификатор.
- создание подходящего адаптера для ListView.
- настройка ListView на использование адаптера
- Добавление прослушивателя onItemClick в ListView, который будет извлекать достаточные сведения (идентификатор) из выбранного элемента., установив Intent extra (s) с деталями, а затем запустите другое действие (которое затем может извлечь детали из Intent).
Пример
Ниже приведен пример, основанный на вашем вопросе.
База данных
База данных с именем mydb и, таким образом, это файл с именем mydb в папках ресурсов есть таблица mytable , которая содержит: -
![enter image description here](https://i.stack.imgur.com/ozlNW.png)
Макет
Простой макет, включает Listview, которому был присвоен идентификатор, который использовался для действия с именем MainActivity , код для ListView: -
<ListView
android:id="@+id/myListView"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
DatabaseHelper
Помощник по базе данных был создан как DBHelper.java .При создании экземпляра он проверяет, существует ли база данных в виде файла, а если нет, то пытается скопировать базу данных из папки ресурсов (возникает исключение времени выполнения, если происходит сбой, например, если актив не существует).База данных затем открывается.Существует один открытый метод getAllFromMytable , который возвращает курсор со всеми строками из таблицы mytable: -
public class DBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mydb"; //<<<<<<<<<< Database file name including extension
public static final int DBVERSION = 101;
public static final String TBL_MYTABLE = "mytable"; //<<<<<<<<<< The table name
public static final String COL_MYTABLE_ID = "id"; //<<<<<<<<<< The id column name
public static final String COl_MYTABLE_TITLE = "title"; //<<<<<<<<<< The title column name
public static final String COL_MYTABLE_DETAILS = "details"; //<<<<<<<<<< The details column name
Context mContext;
SQLiteDatabase mDB;
public DBHelper(Context context) {
super(context, DBNAME, null, DBVERSION);
mContext = context;
if(!ifDBExists()) {
copyDatabaseFromAssetsFolder();
}
mDB = this.getWritableDatabase();
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onDowngrade(db, oldVersion, newVersion);
}
public Cursor getAllFromMytable() {
String[] columns = new String[]{"*, id AS " + BaseColumns._ID}; //<<<<<<<<<< need column named _id so generate it
return mDB.query(TBL_MYTABLE,columns,null,null,null,null,null);
}
private void copyDatabaseFromAssetsFolder() {
int stage = 0, buffer_size = 4096, blocks_copied = 0, bytes_copied = 0;
try {
InputStream is = mContext.getAssets().open(DBNAME);
stage++;
OutputStream os = new FileOutputStream(mContext.getDatabasePath(DBNAME));
stage++;
byte[] buffer = new byte[buffer_size];
int length;
while ((length = is.read(buffer))>0) {
blocks_copied++;
os.write(buffer, 0, length);
bytes_copied += length;
}
os.flush();
os.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
String exception = "";
switch (stage) {
case 0:
exception = "Unable to open asset file " + DBNAME;
break;
case 1:
exception = "Unable to open the Database file " + DBNAME + " for output.";
break;
case 2:
exception = "Error whilst copying " + DBNAME +
" from the assets folder to " + mContext.getDatabasePath(DBNAME).toString() +
" - successfully copied " + String.valueOf(blocks_copied) + " blocks."
;
}
throw new RuntimeException(exception + " (see stack-trace above)");
}
}
// Check if the Database exists
private boolean ifDBExists() {
File db = mContext.getDatabasePath(DBNAME);
if (db.exists()) return true;
if (!db.getParentFile().exists()) {
db.getParentFile().mkdirs();
}
return false;
}
}
MainActivity
Это выполняет 4-7, за исключением того, что довольночем запуск другого действия, детали выбранного элемента в ListView отображаются через тост: -
public class MainActivity extends AppCompatActivity {
ListView mMyListView;
DBHelper mDBHlpr;
Cursor mCsr;
SimpleCursorAdapter mSCA;
Context mContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
mDBHlpr = new DBHelper(this); //<<<<<<<<<< Instantiate the DBHelper
mMyListView = this.findViewById(R.id.myListView);
}
private void manageListView() {
mCsr = mDBHlpr.getAllFromMytable(); //<<<<<<<<<< get the latest data from the database
if (mSCA == null) {
mSCA = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_1,mCsr,
new String[]{DBHelper.COl_MYTABLE_TITLE},
new int[]{android.R.id.text1},
0
);
mMyListView.setAdapter(mSCA);
mMyListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Start the other activity here passing the id (sufficient to find the specififc row)via an intent extra
// Toast used as an example of extracting the respective data from the cursor
Toast.makeText(
mContext,
"You clicked on the row with an id of " + String.valueOf(id) +
" the Title is " + mCsr.getString(mCsr.getColumnIndex(DBHelper.COl_MYTABLE_TITLE)) +
" the Details are " + mCsr.getString(mCsr.getColumnIndex(DBHelper.COL_MYTABLE_DETAILS)) +
" the id column is " + String.valueOf(mCsr.getLong(mCsr.getColumnIndex(DBHelper.COL_MYTABLE_ID))),
Toast.LENGTH_SHORT
).show();
}
});
} else {
mSCA.swapCursor(mCsr);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
mCsr.close(); //<<<<<<<<<< ensure that the cursor is closed when done with
}
@Override
protected void onResume() {
super.onResume();
manageListView(); //<<<<<<<<<< refresh the listview
}
}
Примечания
- Пожалуйста, обратитесь к комментариям и / или соответствующей документации, которая можетлегко получить с помощью поиска
- ManageListView не вызывается напрямую, так как метод onResume запускается при запуске действия.
Результат
Снимок экрана с тостом: -
![enter image description here](https://i.stack.imgur.com/mZuZt.png)
Дополнительно
Передача идентификатора другому действию, затемизвлечение столбца сведений в этом упражнении.
Сначала добавьте новый метод в класс помощника базы данных, чтобы столбец сведений можно было возвращать в виде строки и получать в соответствии с id * 1094.*
например, DBHelВ приведенном выше per.java будет добавлено следующее: -
public String getDetailsFromId(long id) {
String rv = "";
String whereclause = COL_MYTABLE_ID + "=?";
String[] whereargs = new String[]{String.valueOf(id)};
Cursor csr = mDB.query(TBL_MYTABLE,null,whereclause,whereargs,null,null,null);
if (csr.moveToFirst()) {
rv = csr.getString(csr.getColumnIndex(COL_MYTABLE_DETAILS));
}
csr.close();
return rv;
}
Создание другого действия, обеспечивающее его определение в манифесте (используя File / New / Activity, соответственно, изменяет манифест).
Это действие может быть чем-то вроде (это будет отображать детали в соответствии с идентификатором, переданным как long через дополнительное намерение, используемое для начала действия): -
public class OtherActivity extends AppCompatActivity {
public static final String INTENTKEY_MYTABLEIDCOLUMNS = "ikey_mytableidcolumn";
TextView mDetails;
DBHelper mDBHlpr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_other);
mDetails = this.findViewById(R.id.mydetails);
mDBHlpr = new DBHelper(this);
long id = this.getIntent().getLongExtra(INTENTKEY_MYTABLEIDCOLUMNS,-1);
mDetails.setText(mDBHlpr.getDetailsFromId(id));
}
}
Наконец, изменитеначальное действие для создания экземпляра Intent, которое можно использовать для запуска другого действия, затем добавьте идентификатор в качестве дополнительного и, наконец, запустите другое действие, например, в вышеупомянутом упражнении можно использовать следующее (а также, если вы хотите)Тост: -
mMyListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Start the other activity here passing the id (sufficient to find the specififc row)via an intent extra
// Toast used as an example of extracting the respective data from the cursor
/*
Toast.makeText(
mContext,
"You clicked on the row with an id of " + String.valueOf(id) +
" the Title is " + mCsr.getString(mCsr.getColumnIndex(DBHelper.COl_MYTABLE_TITLE)) +
" the Details are " + mCsr.getString(mCsr.getColumnIndex(DBHelper.COL_MYTABLE_DETAILS)) +
" the id column is " + String.valueOf(mCsr.getLong(mCsr.getColumnIndex(DBHelper.COL_MYTABLE_ID))),
Toast.LENGTH_SHORT
).show();
*/
Intent i = new Intent(mContext,OtherActivity.class);
i.putExtra(OtherActivity.INTENTKEY_MYTABLEIDCOLUMNS,id);
startActivity(i);
}
});
Результат (в соответствии с другим действием при нажатии на элемент (в данном случае 1-й)): -
![enter image description here](https://i.stack.imgur.com/8aIQl.png)