Hello, When I Click a item in recyclerView, then show this problem :
D/message: Parcelable encountered IOException writing serializable object (name = com.example.noteapplication.ModelClass)
this is a note app,
I want to click an item to show all Details. Please help me!
What I have tried:
<pre>package com.example.noteapplication;
import android.content.Context;
import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.io.Serializable;
import java.util.ArrayList;
public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> implements Serializable {
MainActivity context;
transient ArrayList<ModelClass>arrayList;
public Adapter(MainActivity context, ArrayList<ModelClass> arrayList) {
this.context = context;
this.arrayList = arrayList;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.singleview,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.title.setText(arrayList.get(position).getTitle());
holder.date.setText(arrayList.get(position).getDate());
holder.imageView.setImageBitmap(arrayList.get(position).getImage());
if (!context.contextModel)
{
holder.checkBox.setVisibility(View.GONE);
}else {
holder.checkBox.setVisibility(View.VISIBLE);
holder.checkBox.setChecked(false);
}
}
@Override
public int getItemCount() {
return arrayList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ImageView imageView;
TextView title,date;
CheckBox checkBox;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
imageView = itemView.findViewById(R.id.imageSet);
title = itemView.findViewById(R.id.titleTXT);
date = itemView.findViewById(R.id.dateTXT);
checkBox = itemView.findViewById(R.id.checkboxID);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
context.itemClick(v,getAdapterPosition());
}
}
}
<pre>package com.example.noteapplication;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import androidx.annotation.Nullable;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
public class Database extends SQLiteOpenHelper implements Serializable {
public static final String DATABASE_NAME = "NoteApplication.db";
public static final int DATABASE_VERSION = 1;
public static final String TABLE_NAME = "NoteApplication";
public static final String COL_ID = "id";
public static final String COL_TITLE = "Title";
public static final String COL_DESCRIPTION = "Description";
public static final String COL_DATE = "Date";
public static final String IMAGE = "Image";
Bitmap image;
public Database(@Nullable Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE "+TABLE_NAME+" ("+COL_ID+" INTEGER PRIMARY KEY AUTOINCREMENT," +
" "+COL_TITLE+" TEXT,"+COL_DESCRIPTION+" TEXT, "+COL_DATE+" TEXT, "+IMAGE+" BLOB)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public Boolean insertData(ModelClass modelClass)
{
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_TITLE,modelClass.getTitle());
contentValues.put(COL_DESCRIPTION,modelClass.getDescription());
contentValues.put(COL_DATE,modelClass.getDate());
image = modelClass.getImage();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG,100,byteArrayOutputStream);
byte [] bytes = byteArrayOutputStream.toByteArray();
contentValues.put(IMAGE,bytes);
long inserted = sqLiteDatabase.insert(TABLE_NAME,null,contentValues);
if (inserted>0)
{
return true;
}else return false;
}
public ArrayList<ModelClass>getData()
{
SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
ArrayList<ModelClass>arrayList = new ArrayList<>();
Cursor cursor = sqLiteDatabase.query(TABLE_NAME,null,null,null,
null,null,null,null);
if (cursor.moveToFirst())
{
do {
int id = cursor.getInt(cursor.getColumnIndex(COL_ID));
String title = cursor.getString(cursor.getColumnIndex(COL_TITLE));
String description = cursor.getString(cursor.getColumnIndex(COL_DESCRIPTION));
String date = cursor.getString(cursor.getColumnIndex(COL_DATE));
byte[] bytes = cursor.getBlob(cursor.getColumnIndex(IMAGE));
if (bytes !=null && bytes.length>0){
image = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
}
ModelClass modelClass = new ModelClass(id,title,description,date,image);
arrayList.add(modelClass);
}while (cursor.moveToNext());
cursor.close();
}
return arrayList;
}
}
package com.example.noteapplication;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.example.input_show.InputActivity;
import com.example.input_show.ShowActivity;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity{
RecyclerView recyclerView;
Database database;
FloatingActionButton floatingActionButton;
Adapter adapter;
boolean contextModel = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView=findViewById(R.id.recyclerID);
floatingActionButton = findViewById(R.id.fabID);
floatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addItem();
}
});
database = new Database(MainActivity.this);
setAdapter();
recyclerView.setLayoutManager(new LinearLayoutManager(this));
String value = getIntent().getStringExtra("tag");
if (value!=null)
{
setAdapter();
}
}
@SuppressLint("NotifyDataSetChanged")
private void setAdapter() {
adapter = new Adapter(MainActivity.this, database.getData());
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
private void addItem() {
Intent intent = new Intent(MainActivity.this, InputActivity.class);
startActivity(intent);
}
public void itemClick(View v, int adapterPosition) {
try {
ModelClass modelClass = database.getData().get(adapterPosition);
Intent intent=new Intent(MainActivity.this, ShowActivity.class);
intent.putExtra("data",modelClass);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
Log.d("message",e.getMessage());
}
}
}
package com.example.noteapplication;
import android.graphics.Bitmap;
import java.io.Serializable;
public class ModelClass implements Serializable {
int id;
String title;
String description;
String date;
Bitmap image;
public ModelClass(int id, String title, String description, String date, Bitmap image) {
this.id = id;
this.title = title;
this.description = description;
this.date = date;
this.image = image;
}
public ModelClass(String title, String description, String date, Bitmap image) {
this.title = title;
this.description = description;
this.date = date;
this.image = image;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public Bitmap getImage() {
return image;
}
public void setImage(Bitmap image) {
this.image = image;
}
}
<pre>package com.example.input_show;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.icu.util.Calendar;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import com.example.noteapplication.Database;
import com.example.noteapplication.ModelClass;
import com.example.noteapplication.R;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.text.SimpleDateFormat;
public class InputActivity extends AppCompatActivity implements Serializable {
ImageView imageView;
EditText title,description;
Button save;
Calendar calendar;
SimpleDateFormat simpleDateFormat;
Bitmap bitmap;
Database database;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_input);
imageView =findViewById(R.id.imageViewID);
title = findViewById(R.id.titleInputID);
description=findViewById(R.id.descriptionInputID);
save =findViewById(R.id.saveBtnID);
database = new Database(this);
save.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onClick(View v) {
getEditText(title,description);
intentSend();
}
});
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
addImage();
}
});
}
private void intentSend() {
Intent intent = new Intent();
intent.putExtra("tag","data");
startActivity(intent);
}
private void addImage() {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent,100);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==100&& resultCode==RESULT_OK)
{
Uri uri = data.getData();
try {
InputStream inputStream = getContentResolver().openInputStream(uri);
bitmap = BitmapFactory.decodeStream(inputStream);
imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}else {
Toast.makeText(this, "Something wrong !", Toast.LENGTH_SHORT).show();
}
}
@SuppressLint("SimpleDateFormat")
@RequiresApi(api = Build.VERSION_CODES.N)
private void getEditText(EditText title, EditText description) {
calendar = Calendar.getInstance();
simpleDateFormat = new SimpleDateFormat("dd-mm-yyyy hh:mm:ss");
String date = simpleDateFormat.format(calendar.getTime());
String inputTitle = title.getText().toString();
String inputDescription = description.getText().toString();
ModelClass modelClass = new ModelClass(inputTitle,inputDescription,date,bitmap);
Boolean insertData=database.insertData(modelClass);
if (insertData)
{
Toast.makeText(this, "Success ", Toast.LENGTH_SHORT).show();
this.finish();
}else {
Toast.makeText(this, "Failed", Toast.LENGTH_SHORT).show();
}
}
}
package com.example.input_show;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.noteapplication.ModelClass;
import com.example.noteapplication.R;
import java.io.Serializable;
public class ShowActivity extends AppCompatActivity implements Serializable {
ImageView imageView;
TextView title,description;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_show);
imageView = findViewById(R.id.imageShowID);
title=findViewById(R.id.titleShowID);
description=findViewById(R.id.descriptionShowID);
ModelClass modelClass = (ModelClass) getIntent().getSerializableExtra("data");
imageView.setImageBitmap(modelClass.getImage());
title.setText(modelClass.getTitle());
description.setText(modelClass.getDescription());
}
}