Я хочу сохранить ImageView в RealmDatabase, поэтому я пытаюсь преобразовать его в байт [], но, похоже, он все еще читает его как ImageView или что-то в этом роде.
Я хотел сохранить это изображение из своего счетчика картинка со спиннера
вот мой код наSaveExpense
public void onSaveExpense() {
//TODO - BITMAP EXPENSE ICONS
if (mCategoriesSpinnerAdapter.getCount() > 0 ) {
if (!Util.isEmptyField(etTotal)) {
Category currentCategory = (Category) spCategory.getSelectedItem();
String total = etTotal.getText().toString();
String description = etDescription.getText().toString();
ImageView theicon =(ImageView) spCategory.getSelectedItem();
Bitmap bitmap = ((BitmapDrawable)theicon.getDrawable()).getBitmap();
ByteArrayOutputStream imgbyte = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, imgbyte);
byte[] expenseIcons = imgbyte.toByteArray();
if (mUserActionMode == IUserActionsMode.MODE_CREATE) {
//TODO - CONSTRUCTOR expenseIcons
RealmManager.getInstance().save(new Expense(description, selectedDate,expenseIcons,mExpenseType, currentCategory, Float.parseFloat(total)), Expense.class);
} else {
Expense editExpense = new Expense();
editExpense.setId(mExpense.getId());
editExpense.setTotal(parseFloat(total));
editExpense.setDescription(description);
editExpense.setIconViewer(expenseIcons);
editExpense.setCategory(currentCategory);
editExpense.setDate(selectedDate);
RealmManager.getInstance().update(editExpense);
}
// update widget if the expense is created today
if (DateUtils.isToday(selectedDate)) {
Intent i = new Intent(getActivity(), ExpensesWidgetProvider.class);
i.setAction(ExpensesWidgetService.UPDATE_WIDGET);
getActivity().sendBroadcast(i);
}
getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null);
dismiss();
} else {
DialogManager.getInstance().showShortToast(getString(string.error_total));
}
} else {
DialogManager.getInstance().showShortToast(getString(string.no_categories_error));
}
}
вот мой адаптер спиннера
public class CategoriesSpinnerAdapter extends ArrayAdapter<Category> {
Category[] categoriesList = null;
LayoutInflater inflater;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView, ViewGroup parent) {
View row = inflater.inflate(R.layout.spinner_ui, parent, false);
Category category = categoriesList[position];
Bitmap bitmap = BitmapFactory.decodeByteArray(category.getImgico(),0,category.getImgico().length);
ImageView imgview = (ImageView)row.findViewById(R.id.spinnerimg);
TextView title = (TextView)row.findViewById(R.id.spinnertext);
title.setText(category.getName());
imgview.setImageBitmap(bitmap);
return row;
}
вот моя ошибка при нажатии кнопки сохранения
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.jmnapps.expensetracker, PID: 9610
java.lang.ClassCastException: io.realm.CategoryRealmProxy cannot be cast to android.widget.ImageView
at com.jmnapps.expensetracker.ui.expenses.NewExpenseFragment.onSaveExpense(NewExpenseFragment.java:199)
at com.jmnapps.expensetracker.ui.expenses.NewExpenseFragment.onClick(NewExpenseFragment.java:169)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)




spCategory.getSelectedItem() возвращает тип Category, поэтому вы не можете преобразовать его в ImageView. Посмотрите на свой код здесь:
Category currentCategory = (Category) spCategory.getSelectedItem();
ImageView theicon =(ImageView) spCategory.getSelectedItem();
Вы видели проблему? Вы пытаетесь привести getSelectedItem к разным типам
Обновлено:
Вы можете изменить это в своей функции onSaveExpense():
Category currentCategory = (Category) spCategory.getSelectedItem();
String total = etTotal.getText().toString();
String description = etDescription.getText().toString();
ImageView theicon =(ImageView) spCategory.getSelectedItem();
Bitmap bitmap = BitmapFactory.decodeByteArray(currentCategory.getImgico(),0,currentCategory.getImgico().length);
ByteArrayOutputStream imgbyte = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, imgbyte);
byte[] expenseIcons = imgbyte.toByteArray();
Почему бы вам просто не назначить это напрямую? byte[] expenseIcons = currentCategory.getImgico() и удалите растровое изображение/байты в onSaveExpense
Поскольку он получит только общее количество и описание, изображение не появится, когда я его сохраню.
хм, currentCategory.getImgico() уже ByteArray верно?
да, я только что попробовал еще раз, только сейчас не работает, я действительно не знаю, почему этот код не работает.
тот же результат :( он просто сохраняет только общее количество и только описание. Я просто опубликую новый вопрос и отправлю вам ссылку для получения более подробной информации.
вот обновленный вопрос... stackoverflow.com/questions/54705295/…
Я видел это, большое спасибо .. теперь, как я могу также включить ImageView, если я использую только один счетчик за раз.
List<Category> categoriesList = Category.getCategoriesExpense(); Category[] categoriesArray = new Category[categoriesList.size()]; categoriesArray = categoriesList.toArray(categoriesArray); mCategoriesSpinnerAdapter = new CategoriesSpinnerAdapter(getActivity(), categoriesArray); mCategoriesSpinnerAdapter.setDropDownViewResource(spinner_ui); spCategory.setAdapter(mCategoriesSpinnerAdapter);это мойCategory. извините, что много спрашиваю.