问题
I have two activity. When the user clicks on the medicine name on the list, it will go to second activity and display the details of the medicine. For the first activity, below is my code:
public class MedicineView extends Activity implements AdapterView.OnItemClickListener
{
private SQLiteDatabase database;
private ArrayList<String> result = new ArrayList<String>();
private ArrayList<Long> idList = new ArrayList<Long>();
private ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.medicine_view);
ListView listContent = (ListView)findViewById(R.id.listView1);
DBHelper helper = new DBHelper(this);
database = helper.getWritableDatabase();
// view data
try{
String query = "select * from " + DBHelper.TABLE_MEDICINE;
Cursor c = database.rawQuery(query, null);
if(c!=null)
{
c.moveToFirst();
int getIndex = c.getColumnIndex(DBHelper.MED_ID);
int getNameIndex = c.getColumnIndex(DBHelper.MED_NAME);
int getDosageIndex = c.getColumnIndex(DBHelper.DOSAGE);
int getFrequencyIndex = c.getColumnIndex(DBHelper.FREQUENCY);
if(c.isFirst())
{
do{
idList.add(c.getLong(getIndex));
result.add(c.getString(getNameIndex)+" | " + c.getString(getDosageIndex)
+" | " + c.getString(getFrequencyIndex)+"\n" );
}while(c.moveToNext());
}
}
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,result);
listContent.setAdapter(adapter);
listContent.setTextFilterEnabled(true);
c.close();
}
catch(SQLException e){
}
listContent.setOnItemClickListener(this);
}
public void onClickHome(View v){
startActivity (new Intent(getApplicationContext(), MenuUtama.class));
}
public void onClickAdd(View v){
startActivity (new Intent(getApplicationContext(), MedicineAdd.class));
}
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Intent myIntent = new Intent(v.getContext(), MedicineDetail.class);
myIntent.putExtra("ID", id);
startActivity(myIntent);
}
} // end class
and this is my second activity
public class MedicineDetail extends Activity
{
private SQLiteDatabase database;
private ArrayList<Long> idList = new ArrayList<Long>();
ArrayList<String> list = new ArrayList<String>();
Button btnEdit;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.medicine_detail);
Intent i = getIntent();
final int id = i.getIntExtra("int", -1);
//int id = getIntent().getIntExtra("id", 2);
btnEdit = (Button)findViewById(R.id.imageButton2);
DBHelper helper = new DBHelper(this);
database = helper.getWritableDatabase();
String sql = "select * from " + DBHelper.TABLE_MEDICINE + " WHERE id = " + id;
Cursor cursor = database.rawQuery(sql, null);
try{
if( cursor != null ){
if (cursor.moveToFirst()) {
do {
idList.add(cursor.getLong(0));
list.add(cursor.getString(1));
list.add(cursor.getString(2));
list.add(cursor.getString(3));
list.add(cursor.getString(4));
list.add(cursor.getString(5));
list.add(cursor.getString(6));
} while (cursor.moveToNext());
}
}
}
catch(SQLException e){
}
cursor.moveToFirst();
TextView StartDate = (TextView) findViewById(R.id.textView8);
TextView EndDate = (TextView)findViewById(R.id.textView9);
TextView MedName = (TextView)findViewById(R.id.textView10);
TextView Dosage = (TextView)findViewById(R.id.textView11);
TextView Frequency = (TextView)findViewById(R.id.textView12);
TextView Instruction = (TextView)findViewById(R.id.textView13);
StartDate.setText(cursor.getString(1));
EndDate.setText(cursor.getString(2));
MedName.setText(cursor.getString(3));
Dosage.setText(cursor.getString(4));
Frequency.setText(cursor.getString(5));
Instruction.setText(cursor.getString(6));
cursor.close();
}
public void onClickHome(View v){
startActivity (new Intent(getApplicationContext(), MedicineView.class));
}
} // end class
this is my logcat
03-05 08:55:08.985: W/Bundle(2186): Key ID expected Integer but value was a java.lang.Long. The default value -1 was returned.
03-05 08:55:09.005: W/Bundle(2186): Attempt to cast generated internal exception:
03-05 08:55:09.005: W/Bundle(2186): java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
03-05 08:55:09.005: W/Bundle(2186): at android.os.Bundle.getInt(Bundle.java:933)
03-05 08:55:09.005: W/Bundle(2186): at android.content.Intent.getIntExtra(Intent.java:3683)
03-05 08:55:09.005: W/Bundle(2186): at com.android.MyDoc.MedicineDetail.onCreate(MedicineDetail.java:32)
03-05 08:55:09.005: W/Bundle(2186): at android.app.Activity.performCreate(Activity.java:4465)
03-05 08:55:09.005: W/Bundle(2186): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-05 08:55:09.005: W/Bundle(2186): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
03-05 08:55:09.005: W/Bundle(2186): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
03-05 08:55:09.005: W/Bundle(2186): at android.app.ActivityThread.access$600(ActivityThread.java:122)
03-05 08:55:09.005: W/Bundle(2186): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
03-05 08:55:09.005: W/Bundle(2186): at android.os.Handler.dispatchMessage(Handler.java:99)
03-05 08:55:09.005: W/Bundle(2186): at android.os.Looper.loop(Looper.java:137)
03-05 08:55:09.005: W/Bundle(2186): at android.app.ActivityThread.main(ActivityThread.java:4340)
03-05 08:55:09.005: W/Bundle(2186): at java.lang.reflect.Method.invokeNative(Native Method)
03-05 08:55:09.005: W/Bundle(2186): at java.lang.reflect.Method.invoke(Method.java:511)
03-05 08:55:09.005: W/Bundle(2186): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-05 08:55:09.005: W/Bundle(2186): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-05 08:55:09.005: W/Bundle(2186): at dalvik.system.NativeStart.main(Native Method)
03-05 08:55:09.053: D/AndroidRuntime(2186): Shutting down VM
03-05 08:55:09.053: W/dalvikvm(2186): threadid=1: thread exiting with uncaught exception (group=0x409961f8)
03-05 08:55:09.093: E/AndroidRuntime(2186): FATAL EXCEPTION: main
03-05 08:55:09.093: E/AndroidRuntime(2186): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.MyDoc/com.android.MyDoc.MedicineDetail}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
03-05 08:55:09.093: E/AndroidRuntime(2186): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
03-05 08:55:09.093: E/AndroidRuntime(2186): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
03-05 08:55:09.093: E/AndroidRuntime(2186): at android.app.ActivityThread.access$600(ActivityThread.java:122)
03-05 08:55:09.093: E/AndroidRuntime(2186): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
03-05 08:55:09.093: E/AndroidRuntime(2186): at android.os.Handler.dispatchMessage(Handler.java:99)
03-05 08:55:09.093: E/AndroidRuntime(2186): at android.os.Looper.loop(Looper.java:137)
03-05 08:55:09.093: E/AndroidRuntime(2186): at android.app.ActivityThread.main(ActivityThread.java:4340)
03-05 08:55:09.093: E/AndroidRuntime(2186): at java.lang.reflect.Method.invokeNative(Native Method)
03-05 08:55:09.093: E/AndroidRuntime(2186): at java.lang.reflect.Method.invoke(Method.java:511)
03-05 08:55:09.093: E/AndroidRuntime(2186): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
03-05 08:55:09.093: E/AndroidRuntime(2186): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
03-05 08:55:09.093: E/AndroidRuntime(2186): at dalvik.system.NativeStart.main(Native Method)
03-05 08:55:09.093: E/AndroidRuntime(2186): Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
03-05 08:55:09.093: E/AndroidRuntime(2186): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:434)
03-05 08:55:09.093: E/AndroidRuntime(2186): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
03-05 08:55:09.093: E/AndroidRuntime(2186): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
03-05 08:55:09.093: E/AndroidRuntime(2186): at com.android.MyDoc.MedicineDetail.onCreate(MedicineDetail.java:70)
03-05 08:55:09.093: E/AndroidRuntime(2186): at android.app.Activity.performCreate(Activity.java:4465)
03-05 08:55:09.093: E/AndroidRuntime(2186): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
03-05 08:55:09.093: E/AndroidRuntime(2186): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
03-05 08:55:09.093: E/AndroidRuntime(2186): ... 11 more
回答1:
Edit : you are getting the long value but id returns int so it throws classcast exception
instead of this
idList.add(cursor.getLong(0));
use this
idList.add(cursor.getInt(0));
Your id is different from the rowid in the table.. Don't mess up with them, You are sending id of the position in your list. So what you need to do is
Create a Hashmap to map ids with data globally
Hashmap Idshash=new Hashmap();
Add values to the hasmap while inserting to results list
long id=c.getLong(getIndex);
String item=c.getString(getNameIndex)+" | " + c.getString(getDosageIndex)
+" | " + c.getString(getFrequencyIndex);
idList.add(id);
Idshash.put(item,id);
result.add(item);
And in onitemclick listener do like this
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
String item=((TextView)v).getText();
long selectedid=Idshash.get(item);
Intent myIntent = new Intent(v.getContext(), MedicineDetail.class);
myIntent.putExtra("ID", selectedid);
startActivity(myIntent);
}
回答2:
In the caller activity you have: myIntent.putExtra("ID", id);
While in the opened activity instead of
i.getIntExtra("int", -1);
it should be
i.getIntExtra("ID", -1);
Notice that the name of the extra should be the same when you try to get it from the intent.
回答3:
in the second activity there is a problem
in the first activity
Intent myIntent = new Intent(v.getContext(), MedicineDetail.class);
myIntent.putExtra("ID", position);
startActivity(myIntent);
final int id = i.getIntExtra("int", -1); should be
final int id = i.getIntExtra("ID", -1);
回答4:
in first actvity change the id
to position
. That's all.
myIntent.putExtra("ID", position);
and in second
getIntExtra("ID", -1);
or
getExtra("ID", -1);
来源:https://stackoverflow.com/questions/15217182/passing-row-id-of-a-list-to-another-activity