[英]how I can get the data from the selected item in the listView from my database and view it on alertdialog?
我在創建的ListView時遇到麻煩:
我有一個食物數據庫,但是如何從數據庫的listView中的所選項目中獲取數據並在alertdialog上查看呢?
我可以查看數據,但是當我單擊任何數據時,我的應用程序將停止運行。
我的代碼如下:
public class MainActivity extends AppCompatActivity {
ListView listView;
EditText editText;
private DatabaseHelperList dbHelper;
Adapter adapter;
ArrayList<Item> arrayList = new ArrayList<Item>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//loadDatabase
dbHelper = new DatabaseHelperList(this);
try {
dbHelper.checkAndCopyDatabase();
dbHelper.openDatabase();
} catch (SQLException e) {
}
try {
Cursor cursor = dbHelper.QueryData("select *from menulist");
if (cursor != null) {
if (cursor.moveToFirst()) {
do {
Item item = new Item();
item.setId(cursor.getString(0));
item.setFood(cursor.getString(1));
item.setCalories(cursor.getString(2));
arrayList.add(item);
} while (cursor.moveToNext());
}
}
} catch (SQLException e) {
}
adapter = new Adapter(this, R.layout.custom_list_item, arrayList);
listView = (ListView) findViewById(R.id.list_item);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View v, int position, long id)
{
Cursor res = dbHelper.getAllData("select " + position + " from menulist");
StringBuffer buffer = new StringBuffer();
while (res.moveToNext()) {
buffer.append("Weight: " + res.getString(1) + " kg \n");
buffer.append("BMI: " + res.getString(2) + "\n");
}
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setCancelable(true);
builder.setTitle("Confirmation:");
builder.setMessage(res.getInt(res.getColumnIndex("id")));
builder.setPositiveButton("YES", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent startNewActivity = new Intent(MainActivity.this, SQLiteDemoActivity.class);
startActivity(startNewActivity);
}
}).setNegativeButton("NO", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
builder.show();
}
}
);
}
}
這條日志:
12-31 23:50:27.734 15775-15775/com.example.hidir.mnutrihealth E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.hidir.mnutrihealth, PID: 15775
android.database.CursorIndexOutOfBoundsException: Index 5 requested, with a size of 5
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:426)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:68)
at com.example.hidir.mnutrihealth.MainActivity$1.onItemClick(MainActivity.java:76)
at android.widget.AdapterView.performItemClick(AdapterView.java:299)
at android.widget.AbsListView.performItemClick(AbsListView.java:1162)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:2953)
at android.widget.AbsListView$3.run(AbsListView.java:3708)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:149)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
at dalvik.system.NativeStart.main(Native Method)
我的第一條建議:
為所有重新創建數據庫創建類DAO。 在這里,如果您添加多個呼叫,它將變得不可讀。
第二:
您確定:
while (res.moveToNext()) {
buffer.append("Weight: " + res.getString(1) + " kg \n");
buffer.append("BMI: " + res.getString(2) + "\n");
}
重量也是字符串,而BMI也是字符串嗎?
如果Weight是int或double,我認為您必須使用res.getInt(1)或res.getDouble(1)。 檢查實際方法,我不記得您必須指定“列名”
編輯:我認為我發現了問題:
while (res.moveToNext()) {
buffer.append("Weight: " + res.getString(1) + " kg \n");
buffer.append("BMI: " + res.getString(2) + "\n");
}
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setCancelable(true);
builder.setTitle("Confirmation:");
builder.setMessage(res.getInt(res.getColumnIndex("id")));
看最后一行。 您想要一個整數,但是光標現在位於之前詢問的項目列表的末尾。
你做 :
將所有元素放在StringBuffer上的while循環,完成后,您需要再等待一次以訪問不再存在的元素。
答案在日志中。 它說, CursorIndexOutOfBoundsException: Index 5 requested, with a size of 5
com.example.hidir.mnutrihealth.MainActivity$1.onItemClick(MainActivity.java:76)
CursorIndexOutOfBoundsException: Index 5 requested, with a size of 5
。
問題在這里,
builder.setMessage(res.getInt(res.getColumnIndex("id")));
在調用方法res.getInt()
,游標的大小為5(表示索引值從0到4),但是它指向索引5。這就是為什么它拋出CursorIndexOutOfBoundsException
的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.