处理多个可包裹阵列列表并获取';布尔java.util.ArrayList.add(java.lang.Object)和#x27;

处理多个可包裹阵列列表并获取';布尔java.util.ArrayList.add(java.lang.Object)和#x27;,java,android,arraylist,parcelable,Java,Android,Arraylist,Parcelable,所以基本上我有两个我目前正在研究的活动:其中一个有一个imagebutton和一个包含值的表。如果我按下按钮,它将带我到另一个表单,用户必须在其中填写以插入新的维修条目。这样做的目的是显示添加的每个条目 以下是活动的两个屏幕截图: 我正在使用您可以有意使用的parcelable arraylist,在其他活动中阅读它并来回传递,但我面临一个问题。每次我尝试进入CarRepair活动时,都会出现一个错误: "Attempt to invoke virtual method 'boolea

所以基本上我有两个我目前正在研究的活动:其中一个有一个imagebutton和一个包含值的表。如果我按下按钮,它将带我到另一个表单,用户必须在其中填写以插入新的维修条目。这样做的目的是显示添加的每个条目

以下是活动的两个屏幕截图:

我正在使用您可以有意使用的parcelable arraylist,在其他活动中阅读它并来回传递,但我面临一个问题。每次我尝试进入CarRepair活动时,都会出现一个错误:

    "Attempt to invoke virtual method 'boolean java.util.ArrayList.add(java.lang.Object)' on a null object reference
                at g3w.gescarcopytest.CarRepair.onCreate(CarRepair.java:74)
你有什么想法可以让它工作吗

CarRepair.java

public class CarRepair extends AppCompatActivity 
{
TableLayout tl;
TableRow tr;
TableRow tr_head;

ArrayList<Repair> repairs = null;
ArrayList<CarDataset> carros;
Bundle bdl;
ImageButton newRepair;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_carrepair);

    bdl = getIntent().getExtras();

    if (bdl != null)
    {
        Log.e("teste1", "TESTE DEU");
        repairs = new ArrayList<>();
        carros = new ArrayList<>();
        carros = bdl.getParcelableArrayList("cars");
        repairs = bdl.getParcelableArrayList("repairs");
        //Log.e("teste3", "Matricula:" + repairs.get(0).licensePlate);
        Log.e("teste4", "Carro presente:" + carros.get(0).brand);
    } else
    {
        Toast.makeText(CarRepair.this, "O Bundle está vazio", Toast.LENGTH_LONG).show();
        Log.e("teste", "TESTE NAO DEU");
    }

    // THIS IS THE LINE WHICH THE ERROR IS COMING FROM!
    repairs.add(new Repair("82-AB-42", "08/03/1993", "Pneus", "Curvão", "1 Pneu", 50.0)); 

    // Log.e("teste4", "Veículo" + repairs.get(0).licensePlate);

    tl = (TableLayout) findViewById(R.id.tl_carrepair_2ndrow);
    createRepairTable(repairs);

    newRepair = (ImageButton)findViewById(R.id.imgbtn_carrepair_insert);

    newRepair.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Intent insertRepair = new Intent();
            insertRepair.putParcelableArrayListExtra("cars", carros);
            insertRepair.putParcelableArrayListExtra("repairs", repairs);
            insertRepair.setClass(CarRepair.this, NewRepair.class);
            startActivity(insertRepair);
        }
    });
}

public void createRepairTable(ArrayList<Repair> repairs)
{
    tr_head = new TableRow(this);
    tr_head.setBackgroundColor(Color.GRAY);
    tr_head.setId(View.generateViewId());
    tr_head.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));

    TextView lable_licensePlate = new TextView(this);
    lable_licensePlate.setId(View.generateViewId());
    lable_licensePlate.setText("Matricula");
    lable_licensePlate.setTextColor(Color.BLACK);
    lable_licensePlate.setPadding(5, 5, 5, 5);
    tr_head.addView(lable_licensePlate);

    TextView lable_date = new TextView(this);
    lable_date.setId(View.generateViewId());
    lable_date.setText("Data");
    lable_date.setTextColor(Color.BLACK);
    lable_date.setPadding(5,5,5,5);
    tr_head.addView(lable_date);

    TextView lable_typeOfCost = new TextView(this);
    lable_typeOfCost.setId(View.generateViewId());
    lable_typeOfCost.setText("Tipo de Custo");
    lable_typeOfCost.setTextColor(Color.BLACK);
    lable_typeOfCost.setPadding(5,5,5,5);
    tr_head.addView(lable_typeOfCost);

    TextView lable_supplier = new TextView(this);
    lable_supplier.setId(View.generateViewId());
    lable_supplier.setText("Fornecedor");
    lable_supplier.setTextColor(Color.BLACK);
    lable_supplier.setPadding(5,5,5,5);
    tr_head.addView(lable_supplier);

    TextView lable_description = new TextView(this);
    lable_description.setId(View.generateViewId());
    lable_description.setText("Descrição");
    lable_description.setTextColor(Color.BLACK);
    lable_description.setPadding(5,5,5,5);
    tr_head.addView(lable_description);

    TextView lable_cost = new TextView(this);
    lable_cost.setId(View.generateViewId());
    lable_cost.setText("Custo");
    lable_cost.setTextColor(Color.BLACK);
    lable_cost.setPadding(5, 5, 5, 5);
    tr_head.addView(lable_cost);

    tl.addView(tr_head, new TableLayout.LayoutParams(TableRow.LayoutParams.FILL_PARENT, android.app.ActionBar.LayoutParams.WRAP_CONTENT));


    for (int i = 0; i < repairs.size(); i++)
    {
        tr = new TableRow(this);
        tr.setId(View.generateViewId());
        tr.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.FILL_PARENT, TableRow.LayoutParams.WRAP_CONTENT));

        TextView lable_licensePlateCar = new TextView(this);
        lable_licensePlateCar.setId(View.generateViewId());
        lable_licensePlateCar.setText(repairs.get(i).licensePlate);
        lable_licensePlateCar.setTextColor(Color.BLACK);
        lable_licensePlateCar.setPadding(2, 0, 5, 0);
        tr.addView(lable_licensePlateCar);

        TextView lable_dateCar = new TextView(this);
        lable_dateCar.setId(View.generateViewId());
        lable_dateCar.setText(repairs.get(i).date);
        lable_dateCar.setTextColor(Color.BLACK);
        lable_dateCar.setPadding(2, 0, 5, 0);
        tr.addView(lable_dateCar);

        TextView lable_typeOfCostCar = new TextView(this);
        lable_typeOfCostCar.setId(View.generateViewId());
        lable_typeOfCostCar.setText(repairs.get(i).typeOfCost);
        lable_typeOfCostCar.setTextColor(Color.BLACK);
        lable_typeOfCostCar.setPadding(2, 0, 5, 0);
        tr.addView(lable_typeOfCostCar);

        TextView lable_supplierCar = new TextView(this);
        lable_supplierCar.setId(View.generateViewId());
        lable_supplierCar.setText(repairs.get(i).supplier);
        lable_supplierCar.setTextColor(Color.BLACK);
        lable_supplierCar.setPadding(2, 0, 5, 0);
        tr.addView(lable_supplierCar);

        TextView lable_descriptionCar = new TextView(this);
        lable_descriptionCar.setId(View.generateViewId());
        lable_descriptionCar.setText(repairs.get(i).description);
        lable_descriptionCar.setTextColor(Color.BLACK);
        lable_descriptionCar.setPadding(2, 0, 5, 0);
        tr.addView(lable_descriptionCar);

        TextView lable_costCar = new TextView(this);
        lable_costCar.setId(View.generateViewId());
        lable_costCar.setText(repairs.get(i).cost.toString());
        lable_costCar.setTextColor(Color.BLACK);
        lable_costCar.setPadding(2, 0, 5, 0);
        tr.addView(lable_costCar);

        tl.addView(tr, new TableLayout.LayoutParams(TableRow.LayoutParams.FILL_PARENT, android.app.ActionBar.LayoutParams.WRAP_CONTENT));
    }

}
public class NewRepair extends AppCompatActivity {

ArrayList<CarDataset> carros = null;
ArrayList<String> carPlates = null;
ArrayList<Repair> repairs = null;
Bundle bdl;

private Spinner spViaturas;
private Spinner spTipoDespesa;
private Spinner spFonecedor;
private String date;
private String description;
private String licensePlate;
private String typeOfCost;
private String supplier;
private String tempCost;
private Double cost;

private TextView mDisplayDate;
private DatePickerDialog.OnDateSetListener mDateSetListener;
private EditText etDescription;
private EditText etCost;
private Button insertNewRepair;
private Button cancelNewRepair;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_repair);

    bdl = getIntent().getExtras();

    if (bdl != null) {
        Log.e("teste1", "TESTE DEU");
        repairs = new ArrayList<>();
        carros = new ArrayList<>();
        carros = bdl.getParcelableArrayList("cars");
        repairs = bdl.getParcelableArrayList("repairs");
        Log.e("teste3", "Matricula:" + repairs.get(0).licensePlate);
        Log.e("teste4", "Carro presente:" + carros.get(0).brand);
    } else {
        Toast.makeText(NewRepair.this, "O Bundle está vazio", Toast.LENGTH_LONG).show();
        Log.e("teste", "TESTE NAO DEU");
    }
    carPlates = new ArrayList<>();
    getCarsPlates(carros);

    insertNewRepair = (Button) findViewById(R.id.btn_newrepair_insert);
    cancelNewRepair = (Button) findViewById(R.id.btn_newrepair_cancel);
    mDisplayDate = (TextView) findViewById(R.id.tv_newrepair_data);
    etDescription = (EditText) findViewById(R.id.et_newrepair_descricao);
    etCost = (EditText) findViewById(R.id.et_newrepair_custo);


    // Adaptador para o Spinner de carros
    ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, carPlates);
    adapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    // Adaptador para o Spinner de Tipo de Despesa
    ArrayAdapter<CharSequence> adapter2 = ArrayAdapter.createFromResource(this, R.array.tipoDespesa, android.R.layout.simple_spinner_dropdown_item);
    adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    // Adaptador para o Spinner de Fornecedor
    ArrayAdapter<CharSequence> adapter3 = ArrayAdapter.createFromResource(this, R.array.fornecedor, android.R.layout.simple_spinner_dropdown_item);
    adapter3.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    // Definir localização dos spinners
    spViaturas = (Spinner) findViewById(R.id.sp_newrepair_viaturas);
    spTipoDespesa = (Spinner) findViewById(R.id.sp_newrepair_tipoDespesa);
    spFonecedor = (Spinner) findViewById(R.id.sp_newrepair_fornecedor);

    // Definir os adaptadores respetivos de cada spinner
    spViaturas.setAdapter(adapter1);
    spTipoDespesa.setAdapter(adapter2);
    spFonecedor.setAdapter(adapter3);


    // O que fazer quando o item for selecionado ou não
    spViaturas.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });

    // Quando é clicado para inserir uma data
    mDisplayDate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Calendar cal = Calendar.getInstance();
            int year = cal.get(Calendar.YEAR);
            int month = cal.get(Calendar.MONTH);
            int day = cal.get(Calendar.DAY_OF_MONTH);

            DatePickerDialog dialog = new DatePickerDialog(NewRepair.this, android.R.style.Theme_Holo_Light_Dialog_MinWidth, mDateSetListener, year, month, day);
            dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
            dialog.show();
        }
    });

    mDateSetListener = new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker datePicker, int year, int month, int day) {
            date = day + "/" + month + "/" + year;
            mDisplayDate.setText(date);
        }
    };

    // Valor inserido no editText de custo
    tempCost = etCost.getText().toString();
    if (!tempCost.isEmpty())
    {
        try
        {
            cost = Double.parseDouble(tempCost);

        }
        catch (Exception e1)
        {
            e1.printStackTrace();
            Toast.makeText(this, "Valor inválido, tente de novo", Toast.LENGTH_SHORT).show();
        }
    }

    // Quando é clicado no botão para inserir uma reparaçao nova
    insertNewRepair.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            description = etDescription.getText().toString();
            licensePlate = spViaturas.getSelectedItem().toString();
            typeOfCost = spTipoDespesa.getSelectedItem().toString();
            supplier = spFonecedor.getSelectedItem().toString();

            repairs.add(new Repair(licensePlate, date, typeOfCost, supplier, description, cost));
            Intent insertNewRepair = new Intent();
            insertNewRepair.putParcelableArrayListExtra("cars", carros);
            insertNewRepair.putParcelableArrayListExtra("repairs", repairs);
            insertNewRepair.setClass(NewRepair.this, CarRepair.class);
            startActivity(insertNewRepair);

        }
    });
    // Quando é clicado no botao para cancelar uma reparacao nova
    cancelNewRepair.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Intent insertNewRepair = new Intent();
            insertNewRepair.putParcelableArrayListExtra("cars", carros);
            insertNewRepair.putParcelableArrayListExtra("repairs", repairs);
            insertNewRepair.setClass(NewRepair.this, CarRepair.class);
            startActivity(insertNewRepair);
        }
    });

}

public void getCarsPlates ( ArrayList<CarDataset> cars)
{
    for(int i = 0; i < cars.size(); i++)
    {
        carPlates.add(carros.get(i).licencePlate);
    }
}
公共类CarRepair扩展了AppCompative活动
{
表格布局tl;
TableRow tr;
表列tr_头;
ArrayList=null;
ArrayList carros;
束bdl;
图像修复;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_carrepair);
bdl=getIntent().getExtras();
如果(bdl!=null)
{
Log.e(“teste1”、“TESTE-DEU”);
修复=新的ArrayList();
carros=新的ArrayList();
carros=bdl.getParcelableArrayList(“汽车”);
修理=bdl.getParcelableArrayList(“修理”);
//Log.e(“teste3”,“Matricula:+修复.获得(0).许可证”);
Log.e(“teste4”,“Carro Presenter:”+carros.get(0.brand));
}否则
{
Toast.makeText(CarRepair.this,“O Bundle estávazio”,Toast.LENGTH_LONG.show();
Log.e(“teste”、“teste-NAO-DEU”);
}
//这就是错误的来源!
增加(新的维修(“82-AB-42”、“08/03/1993”、“Pneus”、“Curvão”、“1 Pneu”,50.0”);
//Log.e(“teste4”,“Veículo”+repairs.get(0).licensePlate);
tl=(表格布局)findViewById(R.id.tl\u carrepair\u 2ndrow);
创建可修复(修复);
newRepair=(图像按钮)findViewById(R.id.imgbtn\u carrepair\u insert);
newRepair.setOnClickListener(新视图.OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
Intent insertRepair=新Intent();
插入修复。putParcelableArrayListExtra(“汽车”,carros);
insertRepair.putParcelableArrayListExtra(“修复”,修复);
insertRepair.setClass(CarRepair.this,NewRepair.class);
startActivity(插入修复);
}
});
}
公共修复表(ArrayList修复)
{
tr_head=新表格行(本);
tr_头.立根基色(颜色.灰色);
tr_head.setId(View.generateViewId());
tr_head.setLayoutParams(新的TableRow.LayoutParams(TableRow.LayoutParams.FILL_父项,TableRow.LayoutParams.WRAP_内容));
TextView lable\U licensePlate=新TextView(本);
lable_licensePlate.setId(View.generateViewId());
标签(即“Matricula”);
lable_licensePlate.setTextColor(颜色:黑色);
标签(5,5,5,5);
tr_头部添加视图(标签牌);
TextView lable_date=新的TextView(此);
标签_date.setId(View.generateViewId());
标签_date.setText(“数据”);
标签日期设置颜色(颜色为黑色);
标签日期设置填充(5,5,5,5);
tr_head.addView(标签日期);
TextView lable_typeOfCost=新的TextView(本);
标签_typeOfCost.setId(View.generateView());
成本设定文本的标签类型(“客户标签”);
标签类型成本设置颜色(颜色为黑色);
成本设置填充的标签类型(5,5,5,5);
tr_head.addView(成本标签类型);
TextView标签\供应商=新的TextView(本);
标签_supplier.setId(View.generateViewId());
标签_supplier.setText(“Fornecedor”);
标签颜色(黑色);
供应商的标签设置填充(5,5,5,5);
tr_head.addView(标签供应商);
TextView lable_description=新的TextView(此);
lable_description.setId(View.generateViewId());
标签_description.setText(“descripção”);
标签描述:setTextColor(颜色:黑色);
标签描述。设置填充(5,5,5,5);
tr_head.addView(标签描述);
TextView标签成本=新TextView(本);
lable_cost.setId(View.generateViewId());
标签成本设置文本(“客户”);
标签成本设置颜色(颜色为黑色);
标签成本设置填充(5,5,5,5);
tr_head.addView(标签成本);
tl.addView(tr_head,new TableLayout.LayoutParams(TableRow.LayoutParams.FILL_PARENT,android.app.ActionBar.LayoutParams.WRAP_CONTENT));
对于(int i=0;iArrayList<Repair> repairs = null;
ArrayList<CarDataset> carros = null;  

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_carrepair); 

    carros = getIntent().getParcelableArrayListExtra("cars");
    if(carros == null)
    {
        carros = new ArrayList<>();
    }
    repairs = getIntent().getParcelableArrayListExtra("repairs");
    if(repairs == null)
    {
        repairs = new ArrayList<>();
    }

    ...
}
 if (bdl != null) //ALWAYS FALSE in your case
    {
        Log.e("teste1", "TESTE DEU");
        repairs = new ArrayList<>();
        carros = new ArrayList<>();
        carros = bdl.getParcelableArrayList("cars");
        repairs = bdl.getParcelableArrayList("repairs");
        //Log.e("teste3", "Matricula:" + repairs.get(0).licensePlate);
        Log.e("teste4", "Carro presente:" + carros.get(0).brand);
    } else
    {
        Toast.makeText(CarRepair.this, "O Bundle está vazio", Toast.LENGTH_LONG).show();
        Log.e("teste", "TESTE NAO DEU");
    }
carros = bdl.getParcelableArrayList ("cars");
if(carros == null){
    carros = new ArrayList<>();
}