#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()
.