Android SQLite 将 gridview 中选择的项目传递到另一个 Activity 进行编辑

Android SQLite Passing Item selected in gridview into another Activity for editing

基本上我有一个包含帐户的数据库。我使用 GridView 查看它们,从那里你可以 select 一个 Account 它会引导你到我的 Activity AccountManagement 在那里你可以修改,删除或者只查看 GridView 中 selected Account 的所有详细信息。

我的问题是将数据从 GridView 中的 selection 传递到 AccountManagement。我不完全确定如何正确使用 Intents。到目前为止,下面的代码不起作用,因为我不知道如何将数据传递到我的 AccountManagement 并从那里正确引用它。

代码在这里,任何带有 Acc 的东西都是有问题的,因为 Acc 是我应该放置来自 GridView 的数据的地方。我用长 ------ 标记了所有这些行,以便更容易发现。请随时询问任何遗漏的代码。

在下面编辑最终代码以供参考。

AccountManagement 片段:

public class AccountDetails extends Activity {

DatabaseHelper dbHelper;
static public LinearLayout Linlay;
EditText txtName;
EditText txtAmt;
EditText txtPurpose;
TextView txtDate;
TextView txtEditDate;
Spinner spinStat;
Spinner spinTerm;

@Override
public void onCreate(Bundle savedInstanceState) {

    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();

    super.onCreate(savedInstanceState);
    setContentView(R.layout.accdetails);

    Linlay = (LinearLayout) findViewById(R.id.Linlay);
    spinStat = (Spinner) findViewById(R.id.spinStat);
    spinTerm = (Spinner) findViewById(R.id.spinTerm);
    txtName = (EditText) findViewById(R.id.txtDelName);
    txtAmt = (EditText) findViewById(R.id.txtDelAmt);
    txtPurpose = (EditText) findViewById(R.id.txtDelPurpose);
    spinTerm = (Spinner) findViewById(R.id.spinTerm);
    txtDate = (TextView) findViewById(R.id.colDate);
    txtEditDate = (TextView) findViewById(R.id.colEditDate);
    spinStat = (Spinner) findViewById(R.id.spinStat);


    Utilities.ManageTermSpinner(AccountDetails.this, spinTerm);
    for(int i=0;i<spinTerm.getCount();i++)
    {
        long id=spinTerm.getItemIdAtPosition(i);
        if(id==Acc.getTerms())--------------------------------------------
        {
            spinTerm.setSelection(i, true);
            break;
        }
    }

    Utilities.ManageStatSpinner(AccountDetails.this, spinStat);
    for(int j=0;j<spinStat.getCount();j++)
    {
        long id=spinStat.getItemIdAtPosition(j);
        if(id==Acc.getStatus())--------------------------------------------
        {
            spinStat.setSelection(j, true);
            break;
        }
    }


    txtName.setText(Acc.getName());---------------------------------------
    txtAmt.setText(String.valueOf(Acc.getAmt()));-------------------------
    txtPurpose.setText(Acc.getPurpose());---------------------------------



    Button delete = (Button) findViewById(R.id.delete);
    delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            AlertDialog diag = Alerts.DeleteConfirm(AccountDetails.this, Acc );--------------------------------
            diag.show();
        }
    });
}

GridView 片段:

这是我应该将数据放入 Acc 的地方,但我不确定如何,所以这里的所有内容都可以更改,因为我不确定这是否是理想的方式它。

        try {
        grid.setOnItemClickListener(new OnItemClickListener() {

            @Override
                public void onItemClick(AdapterView<?> parent, View v, int position,
                                                                long id) {
                try {



                    SQLiteCursor cr = (SQLiteCursor) parent.getItemAtPosition(position);
                    String name = cr.getString(cr.getColumnIndex(DatabaseHelper.colName));
                    int amount = cr.getInt(cr.getColumnIndex(DatabaseHelper.colAmount));
                    String purpose = cr.getString(cr.getColumnIndex(DatabaseHelper.colPurpose));
                    String Terms = cr.getString(cr.getColumnIndex(DatabaseHelper.colTermsClass));
                    String Status = cr.getString(cr.getColumnIndex(DatabaseHelper.colStatClass));
                    String date = cr.getString(cr.getColumnIndex(DatabaseHelper.colDate));
                    String editdate = cr.getString(cr.getColumnIndex(DatabaseHelper.colEditDate));
                    Account acc = new Account(name, amount, purpose, db.GetTermsID(Terms),date,editdate,db.GetStatID(Status));
                    acc.SetID((int) id);

                    Intent myIntent = new Intent(AccountManager.this, AccountDetails.class);
                    Bundle extras = new Bundle();
                    myIntent.putExtras(extras);
                    startActivityForResult(myIntent, 0);


                    } catch (Exception ex) {
                           Alerts.CatchError(AccountManager.this, ex.toString());
                    }
                }


        });
    } catch (Exception ex) {

    }

编辑:

GridView 最终片段:

        try {
        grid.setOnItemClickListener(new OnItemClickListener() {

            @Override
                public void onItemClick(AdapterView<?> parent, View v, int position,
                                                                long id) {
                try {



                    SQLiteCursor cr = (SQLiteCursor) parent.getItemAtPosition(position);
                    String name = cr.getString(cr.getColumnIndex(DatabaseHelper.colName));
                    int amount = cr.getInt(cr.getColumnIndex(DatabaseHelper.colAmount));
                    String purpose = cr.getString(cr.getColumnIndex(DatabaseHelper.colPurpose));
                    String Terms = cr.getString(cr.getColumnIndex(DatabaseHelper.colTermsClass));
                    String Status = cr.getString(cr.getColumnIndex(DatabaseHelper.colStatClass));
                    String date = cr.getString(cr.getColumnIndex(DatabaseHelper.colDate));
                    String editdate = cr.getString(cr.getColumnIndex(DatabaseHelper.colEditDate));
                    Account acc = new Account(name, amount, purpose, db.GetTermsID(Terms),date,editdate,db.GetStatID(Status));
                    acc.SetID((int) id);


                    Intent myIntent = new Intent(AccountManager.this, AccountDetails.class);
                    myIntent.putExtra("AccountObject", acc);
                    startActivityForResult(myIntent, 0);


                    } catch (Exception ex) {
                           Alerts.CatchError(AccountManager.this, ex.toString());
                    }
                }


        });
    } catch (Exception ex) {

    }

AccountManagement 最终片段:

 @Override
public void onCreate(Bundle savedInstanceState) {


    final Account Acc = (Account) getIntent().getSerializableExtra("AccountObject");

    super.onCreate(savedInstanceState);
    setContentView(R.layout.accdetails);

    Linlay = (LinearLayout) findViewById(R.id.Linlay);
    spinStat = (Spinner) findViewById(R.id.spinStat);
    spinTerm = (Spinner) findViewById(R.id.spinTerm);
    txtName = (EditText) findViewById(R.id.txtDelName);
    txtAmt = (EditText) findViewById(R.id.txtDelAmt);
    txtPurpose = (EditText) findViewById(R.id.txtDelPurpose);
    spinTerm = (Spinner) findViewById(R.id.spinTerm);
    txtDate = (TextView) findViewById(R.id.colDate);
    txtEditDate = (TextView) findViewById(R.id.colEditDate);
    spinStat = (Spinner) findViewById(R.id.spinStat);


    Utilities.ManageTermSpinner(AccountDetails.this, spinTerm);
    for(int i=0;i<spinTerm.getCount();i++)
    {
        long id=spinTerm.getItemIdAtPosition(i);
        if(id==Acc.getTerms())
        {
            spinTerm.setSelection(i, true);
            break;
        }
    }

    Utilities.ManageStatSpinner(AccountDetails.this, spinStat);
    for(int j=0;j<spinStat.getCount();j++)
    {
        long id=spinStat.getItemIdAtPosition(j);
        if(id==Acc.getStatus())
        {
            spinStat.setSelection(j, true);
            break;
        }
    }


    txtName.setText(Acc.getName());
    txtAmt.setText(String.valueOf(Acc.getAmt()));
    txtPurpose.setText(Acc.getPurpose());



    Button delete = (Button) findViewById(R.id.delete);
    delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            AlertDialog diag = Alerts.DeleteConfirm(AccountDetails.this, Acc );
            diag.show();
        }
    });

    Button modify = (Button) findViewById(R.id.modify);
    modify.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           AlertDialog diag = Alerts.ShowEditDialog(AccountDetails.this, Acc);
           diag.show();
        }
    });
}

您没有将那个 'acc' 对象放入 Bundle 中,而您正在以空 Intent 启动 AccountDetails activity。

这里有一个例子:Send object from one activity to another Activity using Intent