Нулевая ссылка на объект с пользовательским списком массивов. Где создавать экземпляр?

#java #android #instantiation

#java #Android #создание экземпляра

Вопрос:

Действительно врезался в стену, пытаясь завершить мой проект оценки. Хотелось бы сохранить пользовательский ArrayList в SharedPreferences с помощью gson. Мне нужно добавить оценку к оценкам (пользовательский список массивов). Я прочитал дюжину других подобных сообщений и даже раньше сталкивался с подобной проблемой. Я сходил с ума, пытаясь выяснить, что я создаю неправильно, и где я должен это делать вместо этого. Я чувствую, что я пробовал везде, но я, очевидно, что-то упускаю.

Проблема связана с .add() в приведенном ниже коде.

           saveButton = findViewById(R.id.save);

        saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                estimates.add(newEstimate);
                saveData();
            }
        });
  

Вот действие в полном объеме

         
public class EstimateActivity extends AppCompatActivity {
    private RecyclerView eRecyclerview;
    private CartAdapter eAdapter;
    private RecyclerView.LayoutManager eLayoutManager;
    private ArrayList<Inventory> eCartList;
    private TextView clientName, clientEmail, workOrder;
    private Button saveButton;
    private ArrayList<Estimate> estimates;
    private Estimate newEstimate;
    private String name, code, email;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_estimate);
        estimates = new ArrayList<>();
        newEstimate = new Estimate();

        //get intents
        Intent intent = getIntent();
        newEstimate = intent.getParcelableExtra("newEstimate");
        estimates = intent.getParcelableArrayListExtra("estimates");
        eCartList = intent.getParcelableArrayListExtra("cartList");

        //set up textViews
        workOrder= findViewById(R.id.cart_work_order);
        clientName = findViewById(R.id.client_name_cart);
        clientEmail = findViewById(R.id.cart_email);

         name = newEstimate.getClientName();
        code = newEstimate.getWorkOrder();
        email = newEstimate.getClientEmail();

        workOrder.setText(code);
        clientName.setText(name);
        clientEmail.setText(email);

        //connect recyclerView
        eRecyclerview = findViewById(R.id.recyclerview_cart);
        eLayoutManager = new LinearLayoutManager(this);
        eAdapter = new CartAdapter(eCartList);
        eRecyclerview.setLayoutManager(eLayoutManager);
        eRecyclerview.setAdapter(eAdapter);
        newEstimate.setCart(eCartList);

        //Set up save button
        saveButton = findViewById(R.id.save);

        saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                estimates.add(newEstimate);
                saveData();
            }
        });


    }


    private void saveData(){
        SharedPreferences sharedPreferences = getSharedPreferences("share preferences", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        Gson gson = new Gson();
        String json = gson.toJson(estimates);
        editor.putString("task list", json);
        editor.apply();
    }

}


  

Комментарии:

1. Показать logcat и строку ошибки.

2. Будет сделано, когда я вернусь к компьютеру. Ошибка — это нулевой объект в строке estimates.add(newEstimate)

3. вы уверены estimates = intent.getParcelableArrayListExtra("estimates"); , что работает так, как ожидалось?

4. Как запускается действие? У намерения может не быть ожидаемой полезной нагрузки, которая в конечном итоге estimates (и другие поля) будет null .

Ответ №1:

По оценкам, класс Inventory должен реализовывать разделяемый интерфейс.

Согласно ссылке на Android API, вы должны describeContents() и writeToParcel(Parcel dest, int flags) правильно.

а также выполните нулевую проверку после intent.getParcelableArrayListExtra() .