Мне нужно какое-то объяснение того, как я могу передать любое значение столбца базы данных, которое я хочу, из базы данных для элемента списка.
Я хотел бы иметь возможность получить любое значение и передать его другому действию через putExtras. Я знаю, как сделать эту часть, чего я не очень понимаю, так это того, как получить значение, которое я хочу, из списка, прежде чем отправлять его через намерение.
Вот мой код и еще несколько деталей, которые помогут вам помочь мне:
День.java:
package com.dd.gfit;
public class Day {
private long id;
private long id_routine;
private String name;
private String day;
public long getId() { return id; }
public long getIdRoutine() { return id_routine; }
public String getName() { return name; }
public String getDay() { return day; }
public void setId(long id) { this.id = id; }
public void setIdRoutine(long id_routine) { this.id_routine = id_routine; }
public void setName(String name) { this.name = name; }
public void setDay(String day) { this.day = day; }
}
Здесь значения хранятся и извлекаются. Я понимаю.
DaysDataSource.java:
package com.dd.gfit;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
public class DaysDataSource {
private SQLiteDatabase database;
private MySQLiteHelper dbHelper;
private String[] allColumns = { MySQLiteHelper.COLUMN_ID, MySQLiteHelper.COLUMN_ID_ROUTINE, MySQLiteHelper.COLUMN_NAME, MySQLiteHelper.COLUMN_DAY };
public DaysDataSource(Context context) {
dbHelper = new MySQLiteHelper(context);
}
public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}
public void close() {
dbHelper.close();
}
public Cursor fetchAllDays(long id) {
Cursor cursor = database.query(MySQLiteHelper.TABLE_DAYS, allColumns, MySQLiteHelper.COLUMN_ID_ROUTINE + " = " + id, null, null, null, null);
if (cursor != null) { cursor.moveToFirst(); }
return cursor;
}
}
Это источник данных, из которого я могу извлечь все дни и значения их столбцов в курсор, который будет использоваться в простом курсороадаптере для применения к списку. Я тоже это понимаю.
DaysActivity.java:
package com.dd.gfit;
import android.app.ListActivity;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.widget.SimpleCursorAdapter;
public class DaysActivity extends ListActivity {
private DaysDataSource datasource;
private SimpleCursorAdapter dataAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_days);
datasource = new DaysDataSource(this);
datasource.open();
Cursor cursor = datasource.fetchAllDays(routineDataID);
String[] columns = new String[] { MySQLiteHelper.COLUMN_NAME, MySQLiteHelper.COLUMN_DAY };
int[] to = new int[] { R.id.listitem_day_name, R.id.listitem_day_day };
dataAdapter = new SimpleCursorAdapter(this, R.layout.listitem_day, cursor, columns, to, 0);
setListAdapter(dataAdapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.activity_days, menu);
return true;
}
@Override
protected void onListItemClick(ListView l, View v, int position, long thisID)
{
Day day = (Day)getListAdapter().getItem(position);
long id = day.getId();
Intent startDayActivity = new Intent(this, DayActivity.class);
startDayActivity.putExtra("routineDataID", id);
this.startActivity(startDayActivity);
}
}
Это та часть, которую я не понимаю. Прежде всего, список идеально подходит для того, что я хочу. Функция onListItemClick()
вызывает сбой приложения при его запуске (когда я нажимаю элемент списка). id
, кажется, приближается к нулю или что-то в этом роде? Как будто ему никогда не присваивалось значение для элемента списка.
Мне нужно знать, что мне здесь не хватает. Мне нужен кто-то, кто поможет мне и скажет мне, что мне нужно добавить в мой код и куда это добавить, чтобы я мог лучше понять, как это делать правильно в будущем.
Я предполагаю, что мне нужно применить значения для day
ПЕРЕД попыткой использовать функцию getId()
? Любая помощь будет здорово.
РЕДАКТИРОВАТЬ:
У меня есть кнопка внутри списка, я также хочу иметь возможность захватить id
при нажатии этой кнопки.
Вот код, использующий адаптер массива, который я хотел бы преобразовать в простой курсороадаптер:
public void onClick(View view) {
@SuppressWarnings("unchecked")
ArrayAdapter<Day> adapter = (ArrayAdapter<Day>)getListAdapter();
ListView lv = getListView();
int position = lv.getPositionForView(view);
Day day = (Day) getListAdapter().getItem(position);
long id = day.getId();
}
РЕДАКТИРОВАТЬ СНОВА:
Догадаться. Вот код:
ListView l = getListView();
int position = l.getPositionForView(view);
Cursor cursor = ((SimpleCursorAdapter)l.getAdapter()).getCursor();
cursor.moveToPosition(position);
long id = cursor.getLong(cursor.getColumnIndex(MySQLiteHelper.COLUMN_ID));
String name = cursor.getString(cursor.getColumnIndex(MySQLiteHelper.COLUMN_NAME));