Java 在arraylist中存储抽象类
因此,我正在用java制作一个android应用程序,并有以下几个类 我的问题是,当我在应用程序中创建帐户时,让我们说new CheckingAccount(111111)和new SavingsAccount(222222),然后尝试使用CreateAccountActivity.getAccountNumberID(0)在另一个类中创建所有帐户,并得到以下错误Java 在arraylist中存储抽象类,java,android,inheritance,arraylist,abstract,Java,Android,Inheritance,Arraylist,Abstract,因此,我正在用java制作一个android应用程序,并有以下几个类 我的问题是,当我在应用程序中创建帐户时,让我们说new CheckingAccount(111111)和new SavingsAccount(222222),然后尝试使用CreateAccountActivity.getAccountNumberID(0)在另一个类中创建所有帐户,并得到以下错误 Process: bankapp, PID: 4918 java.lang.RuntimeException: Unab
Process: bankapp, PID: 4918
java.lang.RuntimeException: Unable to start activity
ComponentInfo{bankapp/bankapp.EditAccountActivity}:
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.get(ArrayList.java:437)
at bankapp.CreateAccountActivity.getAccountNumberID(CreateAccountActivity.java:131)
at bankapp.EditAccountActivity.onCreate(EditAccountActivity.java:37)
at android.app.Activity.performCreate(Activity.java:6975)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1213)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2770)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
CreateAccountActivity.java
import android.content.Context;
import android.nfc.Tag;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class CreateAccountActivity extends AppCompatActivity implements
AdapterView.OnItemSelectedListener{
public static ArrayList<BankAccount> aAccount = new ArrayList<BankAccount>();
EditText accountNumberTV, initialBalanceTV;
String accountType;
Context context = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create);
// Spinner element
Spinner spinner = (Spinner) findViewById(R.id.accountTypeSpinner);
// Spinner click listener
spinner.setOnItemSelectedListener(this);
// Spinner Drop down elements
List<String> categories = new ArrayList<String>();
categories.add("Checking");
categories.add("Savings");
categories.add("Credit");
// Creating adapter for spinner
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, categories);
// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// attaching data adapter to spinner
spinner.setAdapter(dataAdapter);
final Button SuSe = (Button) findViewById(R.id.createNewAccountButton);
SuSe.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
accountNumberTV = (EditText) findViewById(R.id.accountNumberView);
accountNumberTV.setTransformationMethod(null);
initialBalanceTV = (EditText) findViewById(R.id.initialBalanceView)
}
});
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
// On selecting a spinner item
accountType = parent.getItemAtPosition(position).toString();
// Showing selected spinner item
//Toast.makeText(parent.getContext(), "Selected: " + item, Toast.LENGTH_LONG).show();
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
public void CreateAccountButton(View view) {
accountNumberTV = (EditText) findViewById(R.id.accountNumberView);
accountNumberTV.setTransformationMethod(null);
initialBalanceTV = (EditText) findViewById(R.id.initialBalanceView);
String acctIDString = accountNumberTV.getText().toString();
int acctID=Integer.parseInt(acctIDString);
String initialBalanceString = initialBalanceTV.getText().toString();
double initialBalance=Float.parseFloat(initialBalanceString);
//bd.setUserInfo(1,newName, newAddress, context);
switch(accountType) {
case "Checking":
aAccount.add(new CheckingAccount(acctID, initialBalance));
break;
case "Savings":
aAccount.add(new SavingsAccount(acctID, initialBalance));
break;
case "Credit":
// code block
break;
}
}
static public int getAccountNumberID (int x){
return aAccount.get(x).getAcctID();
}
static public int getArraySize(){
return aAccount.size();
}
public double getAccountBalance(int x){
return aAccount.get(x).getCurrentBalance();
}
}
SavingsAccount.java
public abstract class BankAccount {
private final int acctID;
double acctBalance = 0;
public BankAccount checking;
public BankAccount savings;
public BankAccount credit;
public BankAccount (int Id, double balance){
this.acctID = Id;
this.acctBalance = balance;
}
public void deposit (double amount){
acctBalance = acctBalance + amount;
//System.out.println(acctBalance);
}
public boolean withdraw (double amount){
if(acctBalance<amount){
//System.out.println("There are insufficient funds.");
return false;
} else
acctBalance = acctBalance - amount;
System.out.println(acctBalance);
return true;
}
double balance (BankAccount acctID) {
return acctBalance;
}
public double getCurrentBalance(){
return acctBalance;
}
public int getAcctID () {
return acctID;
}
public static boolean transfer (double amount, BankAccount fromAccount, BankAccount toAccount) {
if (fromAccount.acctBalance > amount){
fromAccount.acctBalance = fromAccount.acctBalance - amount;
toAccount.acctBalance = toAccount.acctBalance + amount;
//System.out.println(fromAccount.acctBalance);
//System.out.println(toAccount.acctBalance);
return true;
} else
//System.err.println("Insufficient funds");
return false;
}
}
public class CheckingAccount extends BankAccount {
public BankAccount checking;
public CheckingAccount(int Id, double balance) {
super(Id, balance);
}
public void deposit (double amount)
{
super.deposit(amount);
}
}
public class SavingsAccount extends BankAccount{
public BankAccount savings;
public SavingsAccount(int Id, double balance) {
super(Id, balance);
}
public void deposit (double amount)
{
super.deposit(amount);
}
}
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import java.util.ArrayList;
import java.util.List;
public class EditAccountActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
//ArrayList<BankAccount> aAccount2=CreateAccountActivity.getList();
Context context = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_editaccount);
int arraysize = CreateAccountActivity.getArraySize();
// Spinner element
Spinner spinner1 = (Spinner) findViewById(R.id.selectAccountSpinner);
// Spinner click listener
spinner1.setOnItemSelectedListener(this);
// (2) create a simple static list of strings
List<Integer> spinnerArray = new ArrayList<>();
//spinnerArray.add(1);
//spinnerArray.add(aAccount2.get(0).getAcctID());
//spinnerArray.add(aAccount2.get(1).getAcctID());
spinnerArray.add(CreateAccountActivity.getAccountNumberID(0));
spinnerArray.add(CreateAccountActivity.getAccountNumberID(1));
int i = 0;
/* do{
spinnerArray.add(CreateAccountActivity.getAccountNumberID(i));
i++;
}while (i<2);
*/
// (3) create an adapter from the list
ArrayAdapter<Integer> adapter = new ArrayAdapter<Integer>(
this,
android.R.layout.simple_spinner_item,
spinnerArray
);
//adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// (4) set the adapter on the spinner
spinner1.setAdapter(adapter);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}
EditAccount.java
public abstract class BankAccount {
private final int acctID;
double acctBalance = 0;
public BankAccount checking;
public BankAccount savings;
public BankAccount credit;
public BankAccount (int Id, double balance){
this.acctID = Id;
this.acctBalance = balance;
}
public void deposit (double amount){
acctBalance = acctBalance + amount;
//System.out.println(acctBalance);
}
public boolean withdraw (double amount){
if(acctBalance<amount){
//System.out.println("There are insufficient funds.");
return false;
} else
acctBalance = acctBalance - amount;
System.out.println(acctBalance);
return true;
}
double balance (BankAccount acctID) {
return acctBalance;
}
public double getCurrentBalance(){
return acctBalance;
}
public int getAcctID () {
return acctID;
}
public static boolean transfer (double amount, BankAccount fromAccount, BankAccount toAccount) {
if (fromAccount.acctBalance > amount){
fromAccount.acctBalance = fromAccount.acctBalance - amount;
toAccount.acctBalance = toAccount.acctBalance + amount;
//System.out.println(fromAccount.acctBalance);
//System.out.println(toAccount.acctBalance);
return true;
} else
//System.err.println("Insufficient funds");
return false;
}
}
public class CheckingAccount extends BankAccount {
public BankAccount checking;
public CheckingAccount(int Id, double balance) {
super(Id, balance);
}
public void deposit (double amount)
{
super.deposit(amount);
}
}
public class SavingsAccount extends BankAccount{
public BankAccount savings;
public SavingsAccount(int Id, double balance) {
super(Id, balance);
}
public void deposit (double amount)
{
super.deposit(amount);
}
}
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import java.util.ArrayList;
import java.util.List;
public class EditAccountActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener {
//ArrayList<BankAccount> aAccount2=CreateAccountActivity.getList();
Context context = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_editaccount);
int arraysize = CreateAccountActivity.getArraySize();
// Spinner element
Spinner spinner1 = (Spinner) findViewById(R.id.selectAccountSpinner);
// Spinner click listener
spinner1.setOnItemSelectedListener(this);
// (2) create a simple static list of strings
List<Integer> spinnerArray = new ArrayList<>();
//spinnerArray.add(1);
//spinnerArray.add(aAccount2.get(0).getAcctID());
//spinnerArray.add(aAccount2.get(1).getAcctID());
spinnerArray.add(CreateAccountActivity.getAccountNumberID(0));
spinnerArray.add(CreateAccountActivity.getAccountNumberID(1));
int i = 0;
/* do{
spinnerArray.add(CreateAccountActivity.getAccountNumberID(i));
i++;
}while (i<2);
*/
// (3) create an adapter from the list
ArrayAdapter<Integer> adapter = new ArrayAdapter<Integer>(
this,
android.R.layout.simple_spinner_item,
spinnerArray
);
//adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// (4) set the adapter on the spinner
spinner1.setAdapter(adapter);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}
导入android.content.Context;
导入android.os.Bundle;
导入android.support.v7.app.AppActivity;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.Spinner;
导入java.util.ArrayList;
导入java.util.List;
公共类EditAccountActivity扩展AppCompativeActivity实现AdapterView.OnItemSelectedListener{
//ArrayList aaAccount2=CreateAccountActivity.getList();
Context=null;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_editaccount);
int arraysize=CreateAccountActivity.getArraySize();
//旋转元件
微调器微调器1=(微调器)findViewById(R.id.selectAccountSpinner);
//微调器单击侦听器
喷丝头1.SetonimSelectedListener(此);
//(2)创建一个简单的字符串静态列表
List spinnerray=new ArrayList();
//添加(1);
//add(aaAccount2.get(0.getAcctID());
//add(aaAccount2.get(1.getAcctID());
添加(CreateAccountActivity.getAccountNumberID(0));
add(CreateAccountActivity.getAccountNumberID(1));
int i=0;
/*做{
add(CreateAccountActivity.getAccountNumberID(i));
i++;
}而(我是父母){
}
}
将static与活动的实例变量结合使用不起作用。您可以使用ViewModels解决任务。您可以阅读有关它们的更多信息
以及ViewModel:
public class MyViewModel extends ViewModel {
public List<Account> getAccounts() {
// return sth.
}
}
公共类MyViewModel扩展了ViewModel{
公共帐户列表(){
//归还某物。
}
}
将static与活动的实例变量结合使用不起作用。您可以使用ViewModels解决任务。您可以阅读有关它们的更多信息
以及ViewModel:
public class MyViewModel extends ViewModel {
public List<Account> getAccounts() {
// return sth.
}
}
公共类MyViewModel扩展了ViewModel{
公共帐户列表(){
//归还某物。
}
}
是的,这完全奏效了。非常感谢你,你救了我的命。为什么以前没有人教我这个。我的教育可能是免费的,但男孩不好。是的,这完全奏效了。非常感谢你,你救了我的命。为什么以前没有人教我这个。我的教育可能是免费的,但男孩不好。