リストビューアイテムのデータベースから必要なデータベース列の値を渡す方法について、ある種の説明が必要です。
任意の値を取得して、putExtrasを介して別のアクティビティに渡すことができるようにしたいと思います。私はその部分を行う方法を知っていますが、私がよく理解していないのは、インテントを介して送信する前に、リストビューから必要な値を取得する方法です。
これが私のコードとあなたが私を助けるのに役立ついくつかの詳細です:
Day.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;
}
}
これは、すべての日とその列の値をカーソルに取得して、リストビューに適用するsimplecursoradapterで使用できるデータソースです。私もこれを手に入れました。
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
nullか何かが出てくるようですか?リストアイテムに値が割り当てられなかったようです。
ここで何が欠けているのかを知る必要があります。誰かが私を助けてくれて、コードに何を追加する必要があるのか、どこに追加するのかを教えてくれる必要があります。そうすれば、将来これを適切に行う方法をよりよく理解できます。
関数day
を使用する前に、適用された値が必要だと思いますか?getId()
どんな助けでも素晴らしいでしょう。
編集:
id
リストビュー内にボタンがあります。このボタンがクリックされたときにも取得できるようにしたいと思います。
simplecursoradapterに変換したい配列アダプターを使用したコードは次のとおりです。
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));