Click here to Skip to main content
15,878,809 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
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:

Java
<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());
        }
    }
}


Java
<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;

    }
}



Java
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());
        }




    }
}



Java
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;
    }
}



Java
<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());

    }
}
Posted
Comments
Member 15329613 16-Nov-21 9:05am    
1. Don't post so much code.
2. I believe the error is telling you that your ModelClass class cannot be serialized.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900