通过列表的行ID到另一个活动 [英] Passing row id of a list to another activity

查看:103
本文介绍了通过列表的行ID到另一个活动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个活动。当用户点击该列表上的药品名,将进入第二个活动并显示药物的细节。
 对于第一个活动,下面是我的code:

 公共类MedicineView扩展活动实现AdapterView.OnItemClickListener
{
私人SQLiteDatabase数据库;
私人的ArrayList<串GT;结果=新的ArrayList<串GT;();
私人的ArrayList<龙> IDLIST =新的ArrayList<龙>();
私人ArrayAdapter<串GT;适配器;@覆盖
保护无效的onCreate(捆绑savedInstanceState)
{
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.medicine_view);
    ListView控件的listContent =(ListView控件)findViewById(R.id.listView1);    DBHelper帮手=新DBHelper(本);
    数据库= helper.getWritableDatabase();    //查看数据    尝试{
        查询字符串= + DBHelper.TABLE_MEDICINE从选择*;        光标C = database.rawQuery(查询,NULL);        如果(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);            如果(c.isFirst())
            {
                做{
                    idList.add(c.getLong(getIndex));
                    result.add(c.getString(getNameIndex)+|+ c.getString(getDosageIndex)
                            +|+ c.getString(getFrequencyIndex)+\\ n);
                }而(c.moveToNext());
            }
        }        适配器=新ArrayAdapter<串GT;(这一点,android.R.layout.simple_list_item_1,结果);
        listContent.setAdapter(适配器);
        listContent.setTextFilterEnabled(真);        c.close();    }
    赶上(的SQLException E){
    }    listContent.setOnItemClickListener(本);
}公共无效onClickHome(视图v){
    startActivity(新意图(getApplicationContext(),MenuUtama.class));
}公共无效onClickAdd(视图v){
    startActivity(新意图(getApplicationContext(),MedicineAdd.class));
}@覆盖
公共无效onItemClick(适配器视图<>母公司,视图V,INT位置,长的id){
    意图myIntent =新意图(v.getContext(),MedicineDetail.class);
    myIntent.putExtra(ID,ID);
    startActivity(myIntent);
}
} //结束类

这是我第二次活动。

 公共类MedicineDetail扩展活动
 {
私人SQLiteDatabase数据库;
私人的ArrayList<龙> IDLIST =新的ArrayList<龙>();
ArrayList的<串GT;名单=新的ArrayList<串GT;();按钮btnEdit;@覆盖
保护无效的onCreate(捆绑savedInstanceState)
{
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.medicine_detail);    意向I = getIntent();
    最终诠释ID = i.getIntExtra(INT,-1);
    // INT ID = getIntent()getIntExtra(ID,2);    btnEdit =(按钮)findViewById(R.id.imageButton2);    DBHelper帮手=新DBHelper(本);
    数据库= helper.getWritableDatabase();    SQL字符串=SELECT * FROM+ DBHelper.TABLE_MEDICINE +WHERE ID =+ ID;
    光标光标= database.rawQuery(SQL,NULL);    尝试{
        如果(指针!= NULL){
            如果(cursor.moveToFirst()){
               做{
                   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));
               }而(cursor.moveToNext());
            }
        }
    }
    赶上(的SQLException E){
    }    cursor.moveToFirst();    TextView的起始日期=(的TextView)findViewById(R.id.textView8);
    TextView的结束日期=(的TextView)findViewById(R.id.textView9);
    TextView的MedName =(的TextView)findViewById(R.id.textView10);
    【用法用量】TextView的=(的TextView)findViewById(R.id.textView11);
    TextView的频率=(的TextView)findViewById(R.id.textView12);
    TextView的指令=(的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();}公共无效onClickHome(视图v){
    startActivity(新意图(getApplicationContext(),MedicineView.class));
}} //结束类

这是我的logcat

  8月3日至五日:55:08.985:W /包(2186):密钥ID预计整,但价值是一个java.lang.Long中。默认值为-1返回。
8月3日至五日:55:09.005:W /包(2186):尝试投产生内部异常:
8月3日至五日:55:09.005:W /包(2186):java.lang.ClassCastException:java.lang.Long中不能转换为java.lang.Integer中
8月3日至五日:55:09.005:W /包(2186):在android.os.Bundle.getInt(Bundle.java:933)
8月3日至五日:55:09.005:W /包(2186):在android.content.Intent.getIntExtra(Intent.java:3683)
8月3日至五日:55:09.005:W /包(2186):在com.android.MyDoc.MedicineDetail.onCreate(MedicineDetail.java:32)
8月3日至五日:55:09.005:W /包(2186):在android.app.Activity.performCreate(Activity.java:4465)
8月3日至五日:55:09.005:W /包(2186):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
8月3日至五日:55:09.005:W /包(2186):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
8月3日至五日:55:09.005:W /包(2186):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
8月3日至五日:55:09.005:W /包(2186):在android.app.ActivityThread.access $ 600(ActivityThread.java:122)
8月3日至五日:55:09.005:W /包(2186):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1146)
8月3日至五日:55:09.005:W /包(2186):在android.os.Handler.dispatchMessage(Handler.java:99)
8月3日至五日:55:09.005:W /包(2186):在android.os.Looper.loop(Looper.java:137)
8月3日至五日:55:09.005:W /包(2186):在android.app.ActivityThread.main(ActivityThread.java:4340)
8月3日至五日:55:09.005:W /包(2186):在java.lang.reflect.Method.invokeNative(本机方法)
8月3日至五日:55:09.005:W /包(2186):在java.lang.reflect.Method.invoke(Method.java:511)
8月3日至五日:55:09.005:W /包(2186):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
8月3日至五日:55:09.005:W /包(2186):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
8月3日至五日:55:09.005:W /包(2186):在dalvik.system.NativeStart.main(本机方法)
8月3日至五日:55:09.053:D / AndroidRuntime(2186):关闭VM
8月3日至五日:55:09.053:W / dalvikvm(2186):主题ID = 1:螺纹未捕获的异常(组= 0x409961f8)退出
8月3日至五日:55:09.093:E / AndroidRuntime(2186):致命异常:主要
8月3日至五日:55:09.093:E / AndroidRuntime(2186):了java.lang.RuntimeException:无法启动活动ComponentInfo {com.android.MyDoc / com.android.MyDoc.MedicineDetail}:android.database.CursorIndexOutOfBoundsException:指数0要求,大小为0
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在android.app.ActivityThread.access $ 600(ActivityThread.java:122)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1146)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在android.os.Handler.dispatchMessage(Handler.java:99)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在android.os.Looper.loop(Looper.java:137)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在android.app.ActivityThread.main(ActivityThread.java:4340)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在java.lang.reflect.Method.invokeNative(本机方法)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在java.lang.reflect.Method.invoke(Method.java:511)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在dalvik.system.NativeStart.main(本机方法)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):android.database.CursorIndexOutOfBoundsException:由造成指数0要求,大小为0
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在android.database.AbstractCursor.checkPosition(AbstractCursor.java:434)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在com.android.MyDoc.MedicineDetail.onCreate(MedicineDetail.java:70)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在android.app.Activity.performCreate(Activity.java:4465)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
8月3日至五日:55:09.093:E / AndroidRuntime(2186):11 ...更多


解决方案

修改:你所得到的长期价值,但ID返回int所以它抛出异常classcast

而不是这种

  idList.add(cursor.getLong(0));

使用

  idList.add(cursor.getInt(0));


您的ID是在表中从不同的rowid ..不要惹了他们,你在你的列表发送位置的ID。
所以,你需要做的是

创建一个HashMap映射数据IDS全球

 的Hashmap Idshash =新的Hashmap();

添加值到hasmap同时插入结果列表

 长ID = c.getLong(getIndex);
字符串项= c.getString(getNameIndex)+|+ c.getString(getDosageIndex)
                            +|+ c.getString(getFrequencyIndex);
   idList.add(ID);
Idshash.put(项目编号);
  result.add(项目);

和在onitemclick听众做这样的

  @覆盖
公共无效onItemClick(适配器视图<>母公司,视图V,INT位置,长的id){
    字符串项=((的TextView)V).getText();
    长selectedid = Idshash.get(项目);
    意图myIntent =新意图(v.getContext(),MedicineDetail.class);
    myIntent.putExtra(ID,selectedid);
    startActivity(myIntent);
}

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

解决方案

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);
}

这篇关于通过列表的行ID到另一个活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆